CodeForces 607 B. Zuma(区间DP)

来源:互联网 发布:linux 设置语言为英文 编辑:程序博客网 时间:2024/05/20 09:27

Description
给出一个长度为n的串,每秒可以消去一个回文串,问最少需要多少秒才能消掉全部的串
Input
第一行为一整数n,之后为一长度为n的数字串c(1<=n<=500,1<=ci<=n)
Output
输出消去串c最少需要几秒
Sample Input
7
1 4 4 2 3 2 1
Sample Output
2
Solution
区间DP,令dp[l][r]为消掉区间[l,r]的次数,那么dp[l][r]=min(dp[l][r],dp[l][i]+dp[i+1][r])(l<=i<=r-1),当c[l]=c[r]时,在上面的基础上dp[l][r]=min(dp[l][r],dp[l+1][r-1]),具体操作可以用记忆化搜索来实现,已经求出的答案需要记录避免重复计算
Code

#include<cstdio>#include<iostream>#include<cstring>using namespace std;#define maxn 555int n,c[maxn],dp[maxn][maxn];int dfs(int l,int r){    if(dp[l][r])return dp[l][r];    if(l>=r)return dp[l][r]=1;    int ans=r-l+1;    for(int i=l;i<r;i++)        ans=min(ans,dfs(l,i)+dfs(i+1,r));    if(c[l]==c[r])ans=min(ans,dfs(l+1,r-1));    return dp[l][r]=ans;}int main(){    while(~scanf("%d",&n))    {        memset(dp,0,sizeof(dp));        for(int i=1;i<=n;i++)scanf("%d",&c[i]);        printf("%d\n",dfs(1,n));    }    return 0;}
0 0
原创粉丝点击