区间dp代码求调

P2145 [JSOI2007] 祖玛

修改了一个地方,只剩 wa #10 了 ```cpp #include <bits/stdc++.h> using namespace std; int n,f[505][505],x,prex=0,now=0,cnt=0; struct sect{ int num,idx; }; sect a[505]; int main() { cin>>n; memset(f,0x3f,sizeof(f)); for(int i=1;i<=n;i++) { cin>>x; if(i==1) { now=1; prex=x; } else if(x!=prex) { a[++cnt].idx=prex; a[cnt].num=now; now=1; prex=x; } else { now++; } } a[++cnt].idx=prex; a[cnt].num=now; n=cnt; for(int i=1;i<=n;i++) { f[i][i]=3-a[i].num; if(f[i][i]<0)f[i][i]=0; } for(int len=2;len<=n;len++) { for(int i=1;i+len-1<=n;i++) { int j=i+len-1; if(a[i].idx==a[j].idx) { if(a[i].num+a[j].num>=3)f[i][j]=min(f[i][j],f[i+1][j-1]); else f[i][j]=min(f[i][j],f[i+1][j-1]+1); } for(int k=i;k<=j-1;k++) { f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]); if(k>i) { if(a[i].idx==a[j].idx && a[i].idx==a[k].idx) { if(a[i].num+a[k].num<3 || a[k].num+a[j].num<3) f[i][j]=min(f[i][j],f[i+1][k-1]+f[k+1][j-1]); } } } } } cout<<f[1][n]; return 0; } ```
by Zhr100102 @ 2024-03-09 17:24:09


已对拍解决,注意题目只有被插入珠子的区间才能被删除,如果没有被插入过珠子,即使相同珠子数量>=3也没办法消除
by Zhr100102 @ 2024-03-09 17:48:43


|