动态规划——划分为回文串

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2631


题意:

输入一个字符串,问最少可以将它划分成多少个回文串。


思路:

可以设置dp[i]为从第一个字符到第i个字符之间最少可以划分的回文串,然后设1<=j<=i,如果s[j+1]~s[i]是回文串那么dp[i]=min(dp[j]+1)


O(n的三次方)写法,20ms

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define INF 0x3f3f3f3f
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
const int maxn=1010;
char s[maxn];
int dp[maxn];
int len;
bool check(int a, int b)
{
    int left=a, right=b;
    while(a


O(n方)写法,事先打表将回文串标记,30ms。。。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define INF 0x3f3f3f3f
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
const int maxn=1010;
bool wtf[maxn][maxn];
int dp[maxn];
char s[maxn];
int len;
void init()
{
    memset(wtf, 0, sizeof(wtf));
    for(int i=1; i<=len; i++)
        wtf[1][i]=true;
    if(len==1)
        return;
    for(int i=1; i


估计是数据比较弱,导致O(n方)的写法比O(n的三次方)要慢。。。

你可能感兴趣的:(动态规划+搜索)