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

题目大意:一串字符, 通过删除其中一些字符, 能够使这串字符变成回文串。 现在给你一串字符,问能够得到多少种不同的回文串;

注意:字符串"abba", 可以得到9串回文串,分别为'a', 'a', 'b', 'b', 'aa', 'bb', 'aba', 'aba', 'abba'.

解题思路:声明dp[i][j]为字符串[i,j]区间中通过删除可以得到不同回文串的数量

那么有以下两种情况:

1:当str[i] != str[j]时, dp[i][j] = dp[i][j-1] + dp[i+1][j] - dp[i+1][j-1]; (之所以减去dp[i+1][j-1] 是前面两项多加了一个dp[i+1][j-1])

2:当str[i] == str[j]时, dp[i][j] = (dp[i][j-1] + dp[i+1][j] - dp[i+1][j-1]) + (dp[i+1][j-1] + 1);(前面一项是指str[i]和str[j]不对应时能够组成回文串的方案数,第二项是指str[i]和str[j]对应时能够组成回文串的方案数)

需要注意的不能第一项直接循环i, 第二项直接循环j, 那么求dp[i][j]时,dp[i+1][j] 可能还没求得正确的值。

dp数组代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; const int mod = 1e9 + ;
const int INF = 0x3f3f3f3f;
const int N = ;
ll dp[N][N];
char str[N];
void solve(int cases)
{
scanf("%s", str);
int l = strlen(str);
memset(dp, , sizeof(dp));
for(int i=; str[i]; ++ i)
dp[i][i] = ;
for(int len=; len<l; ++ len)
{
for(int i=; i+len<l; ++ i)
{
int j=i+len;
if(str[i] != str[j])
dp[i][j] = dp[i][j-] + dp[i+][j] - dp[i+][j-];
else
dp[i][j] = dp[i][j-] + dp[i+][j] + ;
}
}
printf("Case %d: %lld\n", cases, dp[][l-]);
} int main()
{
int T;
scanf("%d", &T);
for(int i=; i<=T; ++ i)
solve(i);
return ;
}

记忆化搜索代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; const int mod = 1e9 + ;
const int INF = 0x3f3f3f3f;
const int N = ;
ll dp[N][N];
char str[N]; ll dfs(int l, int r)
{
if(l == r)
return dp[l][r] = ;
if(dp[l][r] != -)
return dp[l][r];
if(l > r)
return ; ll ans;
if(str[l] != str[r])
ans = dfs(l, r-) + dfs(l+, r) - dfs(l+, r-);
else
ans = dfs(l, r-) + dfs(l+, r) + ; return dp[l][r] = ans;
} void solve(int cases)
{
scanf("%s", str);
int l = strlen(str);
memset(dp, -, sizeof(dp));
printf("Case %d: %lld\n", cases, dfs(,l-));
} int main()
{
int T;
scanf("%d", &T);
for(int i=; i<=T; ++ i)
solve(i);
return ;
}

Light OJ 1025 - The Specials Menu(动态规划-区间dp)的更多相关文章

  1. Light OJ 1025 - The Specials Menu(区间DP)

    题目大意:     给你一个字符串,问有多少种方法删除字符,使得剩下的字符是回文串. 有几个规定: 1.空串不是回文串 2.剩下的字符位置不同也被视为不同的回文串.如:AA有三种回文串 A, A, A ...

  2. 【lightoj-1025】The Specials Menu(区间DP)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1025 [题目大意] 求一个字符串删去任意字符可以构成多少个不同的回文串 [分析 ...

  3. LightOJ1025 The Specials Menu(区间DP)

    给一个字符串,问有几种删字符的方式使删后的非空字符串是个回文串. 当然区间DP:dp[i][j]表示子串stri...strj的方案数 感觉不好转移,可能重复算了.我手算了"AAA" ...

  4. Lightoj 1025 - The Specials Menu (区间DP)

    题目链接: Lightoj 1025 - The Specials Menu 题目描述: 给出一个字符串,可以任意删除位置的字符,也可以删除任意多个.问能组成多少个回文串? 解题思路: 自从开始学dp ...

  5. 1025 - The Specials Menu

    1025 - The Specials Menu    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 ...

  6. Lightoj 1025 - The Specials Menu

    区间dp /* *********************************************** Author :guanjun Created Time :2016/6/30 23:2 ...

  7. 动态规划——区间dp

    在利用动态规划解决的一些实际问题当中,一类是基于区间上进行的,总的来说,这种区间dp是属于线性dp的一种.但是我们为了更好的分类,这里仍将其单独拿出进行分析讨论. 让我们结合一个题目开始对区间dp的探 ...

  8. Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖

    标题来源:problem=1406">Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路: ...

  9. Light OJ 1406 Assassin`s Creed 状态压缩DP+强连通缩点+最小路径覆盖

    题目来源:Light OJ 1406 Assassin`s Creed 题意:有向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路:最少的的人能够走全然图 明显是最小路径覆盖问题 ...

随机推荐

  1. 网易开发工程师编程题 比较重量 Java

    比较重量 小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量.这些钻石的重量各不相同.在他们们比较了一段时间后,它们看中了两颗钻石g1和g2.现在请你根据之前比较的信息判断这两颗钻石的哪 ...

  2. 通过反射得到object[]数组的类型并且的到此类型所有的字段及字段的值

    private string T_Account(object[] list) { StringBuilder code = new StringBuilder(); //得到数据类型 Type t ...

  3. MVC 全局异常处理及禁用显示头

    MVC网站的global.asax中的Application_Start方法里,有这样一段代码: public class MvcApplication : System.Web.HttpApplic ...

  4. bower安装使用入门详情

    bower安装使用入门详情   bower自定义安装:安装bower需要先安装node,npm,git全局安装bower,命令:npm install -g bower进入项目目录下,新建文件1.tx ...

  5. Composer设置忽略版本匹配的方法

    Composer简介 Composer 是 PHP 的一个依赖管理工具.它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们.Composer 不是一个包管理器.是的,它涉及 "pa ...

  6. bootstrap-列表组

    <div class="container"> <!-- list-group 列表组 给ul添加 list-group-item 列表项 给li添加 --> ...

  7. 中大bbs

    发现个好像很好玩的东东, 中大bbs: luit -encoding gbk telnet bbs.sysu.edu.cn

  8. (转)无法将类型为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Word._Application”。此操作失败的原因是对 IID 为“{00020970-

    HRESULT:0x80030002 无法将类型为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft ...

  9. iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用

    http://blog.csdn.net/totogo2010/article/details/8016129 GCD很好的博文

  10. 初识selenium

    今天尝试了一些selenium,感觉并没有想象中那么难.整理一篇笔记出来. 笔者使用的是Python+selenium.以下内容均是基于Windows系统和Python3.5.2. 首先是下载sele ...