得分250。。我真是个250。。。
犯了一些很搞笑的错。。
f[i][j][k]表示第i个苹果,现在在j这个位置,还能用k次转移。
用i去更新i+1。
时间复杂度1000*2*30;
转移方程有个地方减一写错位了。。这么明显的错竟然没有看见。。50分TAT
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 using namespace std; 6 7 const int N=1100,M=50; 8 int n,K,f[N][3][M],t[N]; 9 10 int maxx(int x,int y){return x>y ? x:y;} 11 void g(int &x,int y){x=maxx(x,y);} 12 13 int main() 14 { 15 // freopen("a.in","r",stdin); 16 freopen("bcatch.in","r",stdin); 17 freopen("bcatch.out","w",stdout); 18 scanf("%d%d",&n,&K); 19 for(int i=1;i<=n;i++) scanf("%d",&t[i]),t[i]--; 20 memset(f,-63,sizeof(f)); 21 f[0][0][K]=0; 22 for(int i=0;i<n;i++) 23 { 24 int now=t[i+1]; 25 for(int k=0;k<=K;k++) 26 { 27 g(f[i+1][now][k],f[i][now][k]+1); 28 if(k>=1) g(f[i+1][now][k-1],f[i][1-now][k]+1); 29 g(f[i+1][1-now][k],f[i][1-now][k]); 30 if(k>=1) g(f[i+1][1-now][k-1],f[i][1-now][k]); 31 } 32 } 33 int ans=0; 34 for(int k=0;k<=K;k++) ans=maxx(ans,maxx(f[n][0][k],f[n][1][k])); 35 printf("%d\n",ans); 36 return 0; 37 }