[CF607B] Zuma - 区间dp
Posted mollnn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CF607B] Zuma - 区间dp相关的知识,希望对你有一定的参考价值。
从一个序列中每次取出一个回文串,求最少取几次(取出后两端外的数会相接)
设 (f[i][j]) 为在闭区间 ([i,j]) 取完所有的花费,则有 (f[i][i]=1, f[i][i+1]=1+[a[i] eq a[i+1]])
转移方程
(f[i][j] = f[i+1][j-1], a[i]=a[j])
(f[i][j] = min_{k=i}^{j-1} (f[i][k]+f[k+1][j]))
#include <bits/stdc++.h>
using namespace std;
int f[505][505],a[505],n;
int main() {
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
memset(f,0x3f,sizeof f);
for(int i=1;i<=n;i++) f[i][i]=1;
for(int i=1;i<n;i++) f[i][i+1]=1+(a[i]!=a[i+1]);
for(int l=2;l<n;l++) {
for(int i=1;i+l<=n;i++) {
int j=i+l;
if(a[i]==a[j]) f[i][j]=f[i+1][j-1];
for(int k=i;k<j;k++) f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
}
}
cout<<f[1][n];
}
以上是关于[CF607B] Zuma - 区间dp的主要内容,如果未能解决你的问题,请参考以下文章
[BZOJ1032][JSOI2007]祖码Zuma 区间dp