zoukankan      html  css  js  c++  java
  • 【lightoj-1025】The Specials Menu(区间DP)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1025

    【题目大意】

    求一个字符串删去任意字符可以构成多少个不同的回文串

    【分析】

    区间dp。传送门

    dp[i][j] 代表从字符i到j, 分两种情况,s[i] != s[j]时,dp[i][j] = dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1];s[i] = s[j] 时,dp[i][j] = dp[i+1][j] + dp[i][j-1] +1。

    你想啊,当s[i] != s[j] 时,dp[i][j] 根据最优子结构性质可以写成dp[i+1][j] + dp[i][j-1],但是有重复的部分,就是以i+1和j-1为端点的,所以需要减去dp[i+1][j-1];

    当s[i] = s[j] 时,为什么不用减去dp[i+1][j-1]呢?这是因为s[i] = s[j] 呀,dp[i+1][j-1]可以加上两个端点的字符构成新的回文串。那为什么要加1呢?第i和第j两个单独的字符也可以构成回文串。

    【代码】

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    char s[65];
    LL dp[65][65];
    int main()
    {
        int t, i, j, cas = 0;
        cin>>t;
        while(t--)
        {
            scanf("%s", s);
            int m = strlen(s);
            memset(dp, 0, sizeof dp);
            for(int k = 1; k <= m; k++)
                for(i = 0; i+k <= m; i++)
                {
                    j = i + k - 1;
                    if(s[i] != s[j]) dp[i][j] = dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1];
                    else dp[i][j] = dp[i+1][j] + dp[i][j-1] + 1;
                }
            printf("Case %d: %lld
    ", ++cas, dp[0][m-1]);
        }
        return 0;
    }
  • 相关阅读:
    Oracle数据类型
    Windows10安装node.js,vue.js以及创建第一个vue.js项目
    Redis Desktop Manager安装
    VMware安装Linux系统
    前端入门学习路线
    架构
    HTML
    Oracle修改表类型方法
    Python学习
    Python(字符串和编码)
  • 原文地址:https://www.cnblogs.com/lesroad/p/8444793.html
Copyright © 2011-2022 走看看