zoukankan      html  css  js  c++  java
  • hdu4632(区间dp)

    题意:

    给定字符串,求不同回文子序列的个数(不同表示小标不同即可)。

    题解:

    考虑区间dp做法

    dp[i][j]表示从i到j的不同子序列的个数,包含一点容斥思想。

    if a[i] 和a[j]不等

    dp[i][j]=dp[i][j-1]+dp[i+1][j]-dp[i+1][j-1] (表示取i到j-1和i+1到减掉i+1到j-1的部分,因为中间加了两次)

     else

    dp[i][j]=dp[i][j-1]+dp[i+1][j]-dp[i+1][j-1] +1+dp[i+1][j-1] =dp[i][j-1]+dp[i+1][j]+1 。(这里好理解了,加上单独取i和j,取i和j之后取中间的部分就不存在重复啦)

    代码:

    #include <iostream>
    #include<bits/stdc++.h>
    using namespace std;
    const int mod=1e4+7;
    string s;
    int dp[1005][1005];
    //dp[i][j]表示区间i到j的最长回文串数目
    int main()
    {
        int T;
        scanf("%d",&T);
        for(int kase=1;kase<=T;kase++){
            memset(dp,0,sizeof(dp));
            for(int i=0;i<1005;i++)dp[i][i]=1;
            cin>>s;
            int len=s.size();
            for(int i=2;i<=len;i++){
                for(int j=0;j+i-1<len;j++){
                    int end=j+i-1;
                    if(s[end]==s[j])
                        dp[j][end]=(dp[j][end-1]+dp[j+1][end]+1)%mod;
                    else
                    dp[j][end]=(dp[j][end-1]+dp[j+1][end]-dp[j+1][end-1]+mod)%mod;
                }
            }
            printf("Case %d: %d
    ",kase,dp[0][len-1]);
        }
        return 0;
    }
    不疯魔不成活
  • 相关阅读:
    swift关键字
    Swift开发注意点
    Mac上安装lua
    Runtime运行时机制
    ios开发中如何选择图片的加载方式
    ios开发中的静态内存分析
    loadrunner-2-9添加事务
    loadrunner-2-8HTML和URL模式
    loadrunner-2-7设置关联
    loadrunner中Windows Resource没有数据或不可用
  • 原文地址:https://www.cnblogs.com/gzr2018/p/11438448.html
Copyright © 2011-2022 走看看