poj 1159 Palindrome dp 字符串
2014-08-05 09:34
615 查看
题目传送门 http://poj.org/problem?id=1159
题意:给你一个字符串 然后让你在这个字符串中随意添加字母,让这个字符串变成回文字符串,问最少要添加几个字符;
一样为例 Ab3bd 可以看出中间三个 已经是回文的了 只要在两边各添加一个就行了 结果有
Adb3bdA dAb3bAd 都是需要添加两个字符 所以答案就是 2
这个和01背包还是有相似之处的,要么加字符,要么不加字符,不同的是多了一个判断,动态规划都是假设如果你i从0开始的话那么假设的就是后边的已经排好了,如果从n-1开始的话 假设的就是前面已经排好了,关键是dp的方程
for(i=n-1;i>=0;i--)
{
for(j=i+1;j<n;j++)
{
if(str[i]==str[j])
dp[i][j]=dp[i+1][j-1];
else
dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1;
}
}
题意:给你一个字符串 然后让你在这个字符串中随意添加字母,让这个字符串变成回文字符串,问最少要添加几个字符;
一样为例 Ab3bd 可以看出中间三个 已经是回文的了 只要在两边各添加一个就行了 结果有
Adb3bdA dAb3bAd 都是需要添加两个字符 所以答案就是 2
这个和01背包还是有相似之处的,要么加字符,要么不加字符,不同的是多了一个判断,动态规划都是假设如果你i从0开始的话那么假设的就是后边的已经排好了,如果从n-1开始的话 假设的就是前面已经排好了,关键是dp的方程
for(i=n-1;i>=0;i--)
{
for(j=i+1;j<n;j++)
{
if(str[i]==str[j])
dp[i][j]=dp[i+1][j-1];
else
dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1;
}
}
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; char str[5100]; int n; short dp[5100][5100]; int main() { while(~scanf("%d",&n)) { int i,j; scanf("%s",str); for(i=n-1;i>=0;i--) { for(j=i+1;j<n;j++) { if(str[i]==str[j]) dp[i][j]=dp[i+1][j-1]; else dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1; } } printf("%d\n",dp[0][n-1]); } }
相关文章推荐
- js中去除字符串str头尾的空格
- 精通Flex 3.0――4.3.1 创建字符串——String类
- WinCE下的非常用字符串操作函数
- 泛型Integer添加字符串
- 字符串截取(倒数第二个分隔符开始)
- PL/SQL字符串截取函数
- C++中字符串与整型浮点型间的转换
- 第十七周项目2 用指针玩字符串(1)
- ASP.NET web.config中数据库连接字符串connectionStrings节的配置方法
- c#字符串的使用
- 【转】C语言 字符数组与字符串
- IE兼容模式下面,js中的json字符串不能有多余的逗号
- 输入6个字符串,并对它们按从大到小的顺序排序后输出。
- c#.net常见字符串处理方法
- freemaker页面中截取指定长度的字符串,超出长度的部分用…替代
- 算法导论 32.4-5 字符串的循环旋转问题
- PAT (Advanced Level) 1060. Are They Equal (25) 字符串转科学计数法
- 相同的字符串常量是可以共享内存的
- php字符串替换的几个函数
- java equals 比较两个字符串,总是返回false