LightOJ - 1033 Generating Palindromes(区间DP)
2015-10-28 22:45
429 查看
题目大意:给你一个字符串,问至少添加几个字符串,才能使这个字符串变成回文串
解题思路:用dp[i][j]表示[i,j]内的字符需要添加几个字符才能变回文
考虑两种情况
1.str[i] == str[j],那么dp[i][j] = dp[i +1][j - 1]
2.str[i] != str[j],那么只能在左边添加一个,或者右边添加一个了
所以dp[i][j] = min(dp[i + 1][j], dp[i][j - 1]) + 1
解题思路:用dp[i][j]表示[i,j]内的字符需要添加几个字符才能变回文
考虑两种情况
1.str[i] == str[j],那么dp[i][j] = dp[i +1][j - 1]
2.str[i] != str[j],那么只能在左边添加一个,或者右边添加一个了
所以dp[i][j] = min(dp[i + 1][j], dp[i][j - 1]) + 1
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 110; char str ; int dp ; int cas = 1; void solve() { scanf("%s", str); int n = strlen(str); memset(dp, 0, sizeof(dp)); for (int len = 1; len < n; len++) { for (int i = 0; i + len < n; i++) { int j = i + len; 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("Case %d: %d\n", cas++, dp[0][n - 1]); } int main() { int test; scanf("%d", &test); while (test--) solve(); return 0; }
相关文章推荐
- python 基本语法 遍历 for while
- xcode一个逆天的功能
- I2C_触摸屏调试记录
- unity之RotateAround 一个物体围绕另外一个物体旋转
- Ubuntu系统的安装与使用:[2]wubi安装镜像
- const||C++
- ios学习之xcode编译器的浅谈
- 用ajax判断帐号是否存在
- 对普里姆算法的一点理解
- 【C++】primer plus 练习7.1
- A new image format for the Web
- php单点登录SSO(Single Sign On)的解决思路
- 使用sts构建Maven Spring webmvc项目
- java中常见的几种Runtimeexception
- python
- Centos7安装图形界面
- Redis 【string】 一句话说明
- NSFileManager的简单介绍,在沙盒目录下对文件进行增删改查
- IOS--之UIWindow(窗口)、UIView(视图)
- DP-POJ-3666-Making the Grade