UVa 10739 String to Palindrome String to Palindrome
2013-01-11 22:47
302 查看
大意不再赘述。
思路:这道题我也思考了好久,最先的思路也是从两边开始判断是否相等,但是有一个操作非常麻烦,就是添加一个字母,这个不好操作,而且我也无法证明它具有最优子结构,所以就一直耗着,然后过了几天去网上查了下资料,原来不需要添加一个字母,这样就简单多了。
思路:这道题我也思考了好久,最先的思路也是从两边开始判断是否相等,但是有一个操作非常麻烦,就是添加一个字母,这个不好操作,而且我也无法证明它具有最优子结构,所以就一直耗着,然后过了几天去网上查了下资料,原来不需要添加一个字母,这样就简单多了。
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int MAXN = 1010; int vis[MAXN][MAXN]; int d[MAXN][MAXN]; char str[MAXN]; const int INF = 0x3f3f3f3f; void read_case() { memset(vis, 0, sizeof(vis)); memset(d, 0, sizeof(d)); scanf("%s", str); } int dp(int i, int j) { int q; int &ans = d[i][j]; if(vis[i][j]) return ans; vis[i][j] = 1; ans = INF; if(j - i < 0) return 0; if(str[i] == str[j]) { q = dp(i+1, j-1); ans = min(ans, q); } else { q = dp(i+1, j); ans = min(ans, q+1); q = dp(i, j-1); ans = min(ans, q+1); q = dp(i+1, j-1); ans = min(ans, q+1); } return ans; } void solve() { read_case(); int n = strlen(str); int ans = dp(1, n-1); printf("%d\n", ans); } int main() { int T, times = 0; scanf("%d", &T); while(T--) { printf("Case %d: ", ++times); solve(); } return 0; }
相关文章推荐
- uva_10739 - String to Palindrome (普通DP)
- UVA 10739 - String to Palindrome
- UVa 10739 String to Palindrome(经典回文串区间DP)
- UVa 10739 - String to Palindrome
- UVA 10739--String to Palindrome +dp
- UVA 10739 String to Palindrome 转换回文 dp递推
- uva 10739 - String to Palindrome
- UVA - 10739 String to Palindrome
- uva10739(String to Palindrome)
- UVA 题目10739 String to Palindrome(区间DP)
- uva 10739 String to Palindrome
- uva 10739 - String to Palindrome(带增删改操作的回文串问题)
- uva10739 - String to Palindrome(简单动归)
- uva 10739 String to Palindrome(dp)
- UVA 10739 String to Palindrome
- UVa 10739 - String to Palindrome
- UVA 10739 String to Palindrome(dp)
- UVa 10739 - String to Palindrome
- uva 10739 String to Palindrome
- UVA 10739 String to Palindrome