uva 11151(dp)
来源:互联网 发布:数据库考试题库 编辑:程序博客网 时间:2024/06/08 14:50
题意:给出一个字符串,要求输出字符串中的最长的回文子串的长度。
题解:递归dp,f[i][j]代表从i到j的字符串内最长回文串长度。
#include <stdio.h>#include <string.h>const int N = 1000;char str[N];int f[N][N];int dp(int l, int r) {if (f[l][r] != -1)return f[l][r];if (l > r)return 0;if (l == r)return 1;if (str[l] == str[r])return f[l][r] = dp(l + 1, r - 1) + 2;else {int temp1 = dp(l + 1, r);int temp2 = dp(l, r - 1);f[l][r] = temp1 > temp2 ? temp1 : temp2;return f[l][r];}}int main() {int t;scanf("%d", &t);getchar();while (t--) {memset(f, -1, sizeof(f));gets(str);int len = strlen(str);printf("%d\n", dp(0, len - 1));}return 0;}
网上看到的其他做法,把字符当做中间字符,然后向两边扩展,要先找相同,这是为了先能找到找偶数回文,再找奇数回文。
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int N = 1000005;char str[N];int solve() {int res = 0, len = strlen(str);for (int i = 1; str[i]; i++) {int s = i, e = i;while (str[s] == str[e + 1])e++;i = e;while (str[s - 1] == str[e + 1]) {s--;e++;}res = max(res, e - s + 1);}return res;}int main() {str[0] = '$';int t;scanf("%d", &t);while (t--) {scanf("%s", str + 1);printf("%d\n", solve());}return 0;}
0 0
- uva 11151(dp)
- Longest Palindrome - UVa 11151 dp
- UVa 11151 - Longest Palindrome 字符串dp
- UVa 11151 - Longest Palindrome(区间dp)
- uva 10453 回文串dp uva 10739 uva 11151最长回文串 poj 3280
- UVA DP 入门专题
- uva 1424 简单DP
- uva 10192 DP
- UVA dp题目汇总
- UVa 4256 - Salesmen dp
- UVa 10271 - Chopsticks dp
- UVA 1424 - Salesmen (dp)
- uva 672 Gangsters( dp )
- UVA 10271 Chopsticks(dp)
- uva 10271 Chopsticks(dp)
- UVA 11584 DP水题
- UVA 1424 DP水题
- UVA 10534 DP+LIS
- 我的c语言笔记---字符串
- 设计模式 观察者模式
- 代码高亮之prettify
- 从写软件到买软件2
- uvaoj 10130-SuperSale 动态规划
- uva 11151(dp)
- centos 安装yum
- 安装linux发生的无法引导windows以及windows分区变为raw的解决
- SQL Server 服务器更名及添加Windows登录名
- 痴迷一世却为人的生活
- leetcode: Jump Game II
- 血型统计
- 大奖赛计分-1
- FreeMarker帮助手册