CodeForces 607 B. Zuma(区间DP)

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
#include
#include
using namespace std;
#define maxn 555
int 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;i1,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;
}

你可能感兴趣的:(Code,Forces,区间DP)