• lightoj1025_区间dp


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

    题目描述:

      给出一个字符串,可以任意删除位置的字符,也可以删除任意多个。问能组成多少个回文串?

    解题思路:

      自从开始学dp,感觉自己智商一直处于离线状态。席八啊啊啊啊啊啊!今天随机到这个题目,看了好久竟然没有看出来是区间DP。知道是区间DP后立马感觉明白。

      情景设定 dp[l][r] 表示 区间 [l, r] 内的回文串数目。

      状态转移:dp[l][r] = dp[l][r-1] + dp[l+1][r], 但是这样会加重复的,所以要减去dp[l+1][r-1], 当a[l] == a[r]的时候,对于区间[l, r]之间的回文串,就可以变成以a[l]与a[r]结尾的,然后就需要加上。

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <cstdio>
     6 #include <vector>
     7 #include <ctime>
     8 #include <queue>
     9 #include <list>
    10 #include <set>
    11 #include <map>
    12 using namespace std;
    13 #define INF 0x3f3f3f3f
    14 typedef long long LL;
    15 
    16 char a[100];
    17 LL dp[100][100];
    18 int main()
    19 {
    20     int t;
    21     scanf("%d", &t);
    22     for(int ca = 1; ca <= t; ca++)
    23     {
    24         scanf("%s", a+1);
    25         int len = strlen(a+1);
    26         memset(dp, 0, sizeof(dp));
    27         for(int i = 1; i <= len; i++)
    28         {
    29             for(int l = 1; l+i-1 <= len; l++)
    30             {
    31                 int r = l+i-1;
    32                 dp[l][r] += dp[l+1][r] + dp[l][r-1];
    33                 if(a[l] == a[r])
    34                     dp[l][r]++;
    35                 else
    36                     dp[l][r] -= dp[l+1][r-1];
    37             }
    38         }
    39         printf("Case %d: %lld
    ", ca, dp[1][len]);
    40     }
    41     return 0;
    42 }
  • 相关阅读:
    osg::BlendFunc来设置透明度
    LCA(Tarjan)
    CODEVS1073 家族 (并查集)
    CODEVS1533 互斥的数(哈希表)
    2014-12-4
    BZOJ2661 连连看 (费用流)
    2014-11-30
    JAVA语法基础作业——动手动脑以及课后实验性问题
    课后作业01——相加
    再读大道至简第二章
  • 原文地址:https://www.cnblogs.com/luomi/p/5931205.html
Copyright © 2020-2023  润新知