标签:strlen ble header adb void 代码 algo lse length
题目链接:https://cn.vjudge.net/problem/UVA-11584
给一个字符串序列,问回文串的最少个数。
例:aaadbccb
分为aaa, d, bccb三份
n<=1000
这道题还是简单的,首先可以设想dp(i)为前i个字符中最少个数。
那么转移方程随之而来,dp(i)=min( dp(j-1)+1 | [j, i]是回文串 )。
这里分析复杂度是O(n^3),但是咱可以预处理[j, i]是不是回文串,复杂度降到O(n^2)。
AC |
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1000+20, INF=0x3f3f3f3f;
char str[maxn];
bool isloop[maxn][maxn];
int dp[maxn];
int main(void){
int T;
scanf("%d", &T);
while (T--){
scanf("%s", str);
int n=strlen(str);
memset(isloop, false, sizeof(isloop));
for (int i=0; i<n; i++){
isloop[i][i]=true;
for (int j=1; i-j>=0 && i+j<n; j++)
if (str[i-j]==str[i+j])
isloop[i-j][i+j]=true;
else break;
if (i<n-1) for (int j=0; i-j>=0 && i+1+j<n; j++){
if (str[i-j]==str[i+j+1])
isloop[i-j][i+j+1]=true;
else break;
}
}
dp[0]=1;
for (int i=1; i<n; i++){
dp[i]=INF;
for (int j=i; j>=0; j--)
if (isloop[j][i]){
if (j-1>=0) dp[i]=min(dp[i], dp[j-1]+1);
else dp[i]=1;
}
}printf("%d\n", dp[n-1]);
}
return 0;
}
Time | Memory | Length | Lang | Submitted |
---|---|---|---|---|
20ms | None | 1084 | C++ 5.3.0 | 2018-08-06 05:41:42 |
UVA-11584 Partitioning by Palindromes 动态规划 回文串的最少个数
标签:strlen ble header adb void 代码 algo lse length
原文地址:https://www.cnblogs.com/tanglizi/p/9438837.html