zuma——区间dp
作者:互联网
CF607B Zuma - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
一道很好的区间dp题。
这道题主要就是用回文字符串分析。状态表示为区间[i,j]的最小操作次数
我们可以画数轴。
1.当数轴只有一个单位的时候,f[i,i]=1。
2.当数轴上有两个单位时,如果a[i]与a[j]相同,f[i,j]=1;如果不同,f[i,j]=2
3.当数轴上有三个单位时,我们就可以看作是一个字符串从两边扩展出来的。
如果a[i]与a[j]相同,f[i,j]=f[i+1,j-1],这就是从i+1到j-1从两边再扩展一步得到的结果,因为f[i+1,j-1]是最优解,那么a[i],a[j]构成了回文,不需要次数再加一
如果不同,f[i,j]就是普通的区间dp求min
亮点就是用回文字符串向两边扩展得到更进一步的最优解
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=600; 4 int a[N],f[N][N]; 5 6 int main() 7 { 8 int n;scanf("%d",&n); 9 for(int i=1;i<=n;i++)scanf("%d",&a[i]); 10 memset(f,0x3f,sizeof f); 11 12 for(int len=1;len<=n;len++) 13 { 14 for(int i=1;i+len-1<=n;i++) 15 { 16 int j=i+len-1; 17 if(i==j) 18 { 19 f[i][j]=1; 20 continue; 21 } 22 if(len==2) 23 { 24 if(a[i]==a[j])f[i][j]=1; 25 else f[i][j]=2; 26 continue; 27 } 28 29 if(a[i]==a[j])f[i][j]=min(f[i][j],f[i+1][j-1]); 30 for(int k=i;k<j;k++) 31 f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]); 32 } 33 } 34 35 printf("%d\n",f[1][n]); 36 37 38 39 return 0; 40 }View Code
标签:数轴,int,zuma,字符串,区间,dp,回文 来源: https://www.cnblogs.com/wellerency/p/16101649.html