85 条题解
-
2猫粮寸断 LV 10 @ 2018-09-04 21:37:07
裸DP,前缀和优化即可
部分式子进行了化简#include<iostream> #include<cstring> #include<cmath> using namespace std; int sum[3010],dp[3010]; int main() { memset(dp,0x3f,sizeof(dp)); int n,d,i,j; char a; cin>>n>>d; for(i=1;i<=n;i++) { cin>>a; if(a=='H') sum[i]=sum[i-1]+1; else sum[i]=sum[i-1]; } dp[0]=0; for(i=1;i<=n;i++) for(j=0;j<i;j++) if(int(abs(2*sum[i]-2*sum[j]-i+j))<=d||sum[i]-sum[j]==0||sum[i]-sum[j]==i-j) dp[i]=min(dp[i],dp[j]+1); cout<<dp[n]; return 0; }
-
22017-02-04 14:50:43@
开始想到了贪心,后来才发现思路是错的,于是想到dp dp方程从之前的题解中找。 代码: #include<cstdio> #include<cstring> #include<math.h> #include<cctype> #define C c=getchar() using namespace std; int f[2501],j[2501],h[2501]; int n,p; int main(){ scanf("%d%d",&n,&p); memset(j,0,sizeof(j)); memset(h,0,sizeof(h)); for(int i=1;i<=n;i++){ char C; while(!isalpha(c))C; j[i]=j[i-1]; h[i]=h[i-1]; if(c=='J')j[i]++;else h[i]++; } memset(f,0x3f,sizeof(f)); f[0]=0; for(int i=1;i<=n;i++){ for(int k=1;k<=i;k++){ int J=j[i]-j[k-1],H=h[i]-h[k-1]; if(abs(J-H)<=p||J==0||H==0){ if(f[i]>f[k-1]+1)f[i]=f[k-1]+1; } } } printf("%d\n",f[n]); return 0; }
-
12009-10-30 19:53:18@
f[i]表示前i个人需要多少辆车。
a[i]表示前i个人有多少人为H。
b[i]表示前i个人有多少人为J。转移方程:
对于所有满足abs((a[i]-a[j])-(b[i]-b[j])) -
02017-07-18 18:38:56@
这...我读错题了。
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #define INF (0x3f3f3f3f) using namespace std; int n,d; int hct[2510],jct[2510],dp[2510]; int main() { ios::sync_with_stdio(false); cin>>n>>d; for(int i=1;i<=n;i++) { char cc[6]; cin>>cc; hct[i]=hct[i-1],jct[i]=jct[i-1]; if (cc[0]=='H') hct[i]++; else jct[i]++; } memset(dp,INF,sizeof(dp)); dp[0]=0; for(int i=1;i<=n;i++) for(int j=0;j<i;j++) if (abs((hct[i]-hct[j])-(jct[i]-jct[j]))<=d ||(hct[i]-hct[j]==0 ||jct[i]-jct[j]==0)) dp[i]=min(dp[i],dp[j]+1); cout<<dp[n]<<endl; return 0; }
但没关系啦。
-
02016-07-14 18:16:33@
Free Pascal Compiler version 3.0.0 [2015/11/16] for i386
Copyright (c) 1993-2015 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling foo.pas
foo.pas(21,8) Warning: Variable "c" does not seem to be initialized
Linking foo.exe
24 lines compiled, 0.0 sec, 28288 bytes code, 1268 bytes data
1 warning(s) issued
测试数据 #0: Accepted, time = 0 ms, mem = 848 KiB, score = 10
测试数据 #1: Accepted, time = 0 ms, mem = 848 KiB, score = 10
测试数据 #2: Accepted, time = 0 ms, mem = 844 KiB, score = 10
测试数据 #3: Accepted, time = 15 ms, mem = 848 KiB, score = 10
测试数据 #4: Accepted, time = 15 ms, mem = 848 KiB, score = 10
测试数据 #5: Accepted, time = 15 ms, mem = 844 KiB, score = 10
测试数据 #6: Accepted, time = 15 ms, mem = 848 KiB, score = 10
测试数据 #7: Accepted, time = 15 ms, mem = 848 KiB, score = 10
测试数据 #8: Accepted, time = 15 ms, mem = 844 KiB, score = 10
测试数据 #9: Accepted, time = 15 ms, mem = 844 KiB, score = 10
Accepted, time = 105 ms, mem = 848 KiB, score = 100
program ball;
var a:array[1..2500]of char;
b,c:array[0..2500]of int64;
n,m,min:int64;
i,j:longint;
begin
assign(input,'ball.in');
assign(output,'ball.out');
reset(input);
rewrite(output);
readln(n,m);
b[0]:=0;
for i:=1 to n do
begin
readln(a[i]);
case a[i] of
'H':b[i]:=b[i-1]+1;
'J':b[i]:=b[i-1]-1;
end;
end;
for i:=1 to n do
begin
min:=maxlongint;
for j:=0 to i-1 do
if (abs(b[i]-b[j])<=m)or(abs(b[i]-b[j])=i-j) then
if min>c[j] then min:=c[j];
c[i]:=min+1;
end;
writeln(c[n]);
close(input);
close(output);
end. -
02015-08-02 19:38:56@
program a1331;
var
i,j,k,l,n,m,g,h,d,kk:longint;
c:array[0..2600]of longint;
f:array[0..5000]of longint;
ch:char;
function min(x,y:longint):longint;
begin
if x>y then exit(y) else exit(x);
end;
begin
assign(input,'1.txt'); reset(input);
readln(n,d);
for i:=1 to n do
begin
readln(ch);
if ch='J' then
begin
inc(m);
c[i]:=m;
end
else
begin
dec(m);
c[i]:=m;
end;
end;
for i:=1 to n do
f[j]:=0;
for i:=1 to n do
begin
kk:=maxlongint;
for j:=0 to i-1 do
if (abs(c[i]-c[j])<=d)or(abs(c[i]-c[j])=i-j) then
if kk>f[j] then
begin
kk:=f[j];
if kk=0 then
break;
end;
f[i]:=kk+1;
end;
writeln(f[n]);
end. -
02015-08-02 19:38:26@
program a1331;
var
i,j,k,l,n,m,g,h,d,kk:longint;
c:array[0..2600]of longint;
f:array[0..5000]of longint;
ch:char;
function min(x,y:longint):longint;
begin
if x>y then exit(y) else exit(x);
end;
begin
assign(input,'1.txt'); reset(input);
readln(n,d);
for i:=1 to n do
begin
readln(ch);
if ch='J' then
begin
inc(m);
c[i]:=m;
end
else
begin
dec(m);
c[i]:=m;
end;
end;
for i:=1 to n do
f[j]:=0;
for i:=1 to n do
begin
kk:=maxlongint;
for j:=0 to i-1 do
if (abs(c[i]-c[j])<=d)or(abs(c[i]-c[j])=i-j) then
if kk>f[j] then
begin
kk:=f[j];
if kk=0 then
break;
end;
f[i]:=kk+1;
end;
for i:=1 to n do
write(f[i],' ');writeln;
writeln(f[n]);
end. -
02009-11-09 15:40:44@
我被这个题彻底虐了,细节啊细节...
program cl(input,output);
var a:array[0..2500,1..2]of longint;
f:array[0..2500]of longint;
c:array[1..2500]of char;
n,d,i,j:longint;function min(x,y:longint):longint;
begin
if x>y then exit(y)
else exit(x);
end;begin
readln(n,d);
for i:=1 to n do
begin
readln(c[i]);
if c[i]='H' then inc(a);
if c[i]='J' then inc(a);
a:=a[i];
end;
for i:=1 to n do
f[i]:=10000000;
for i:=1 to n do
for j:=1 to i do
if (trunc(abs(a-a[j-1,1]-a+a[j-1,2])) -
02009-11-08 08:54:58@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms
第40道,纪念一下 -
02009-11-02 18:17:56@
- -
一开始初始值赋太小了。。
- -
-
02009-10-23 22:37:41@
编译通过...
├ 测试数据 01:答案正确... 9ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 72ms
├ 测试数据 07:答案正确... 88ms
├ 测试数据 08:答案正确... 56ms
├ 测试数据 09:答案正确... 103ms
├ 测试数据 10:答案正确... 134ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:462msvar n,d,i,j:longint;
f:array[0..2502]of longint;
a,b:array[0..2502,0..2502]of longint;
x:array[0..2502]of char;
function min(x,y:longint):longint;
begin
if x>y then min:=y else min:=x;
end;
begin
readln(n,d);
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),0);
for i:=1 to n do readln(x[i]);
for i:=1 to n do
for j:=i to n do
begin
a:=a;
b:=b;
if x[j]='H' then inc(a) else inc(b);
end;
f[1]:=1;
for i:=2 to n do
begin
f[i]:=99999999;
for j:=1 to i do
begin
if (abs(a[j,i]-b[j,i]) -
02009-10-22 21:19:05@
注意f[0]=0
-
02009-10-17 13:57:20@
初始化和符号
要俺命也
-
02009-10-15 20:58:13@
郁闷~
水题罢了 -
02009-10-05 14:04:10@
AC........
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms***|\**|\**|\**|\**|\**|\**|\**|\**|\**|\**|\**|\**|\*|
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@begin
readln(n,d);
for i:=1 to n do
begin
readln(s);
if s='H' then a[i]:=a+1 else a[i]:=a-1;
end;f[1]:=1;
for i:=2 to n do
begin
f[i]:=maxint;
for j:=0 to i-1 do
begin
if (abs(a[i]-a[j]) -
02009-10-04 11:18:38@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms---|---|---|---|---|---|---|---|-
【预处理】:
其中'J'=>a[i]=1 'H'=>a[i]=-1;
再统计:a[i]:=a[i]+a【DP过程】:
for i:=1 to n do
p:=maxlongint;
for j:=0 to i-1 do
if (abs(a[i]-a[j])f[j] then begin p:=f[j]; if p=0 then break; end;f[i]:=p+1;
【条件的解释】
abs(a[i]-a[j]) -
02009-09-12 08:27:13@
f[i]=min(f[k]+1)
且保证k+1至第i个人乘一辆巴士不会产生冲突 -
02009-09-06 16:33:25@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms
秒杀
f[i]=min(f[k])+1;(0 -
02009-08-21 10:58:59@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms不降子序列的变形
-
02009-08-17 10:48:39@
一次AC总归是一件快乐的事情!
在思考中充分体会到了dp的思维灵活性,因为我原先想了一个O(n^3)然后一看铁定过不了,然后随便一改方程,就变成O(n^2)的了……
看到很多人写了,所以草草结束本次ac感言……
f[i]:=min(f[k])+1
O(n^2)预处理一下当前i~j是否可行
程序35行