您的位置:首页 > 其它

Palindrome Partitioning II

2013-04-09 22:40 267 查看
设dp[i]表示从0到i位置最少需要切割的刀数。则这道题目的状态转移方程为:dp[i]=min(dp[j])+1,其中j>=0&&j<i&&p[j+1][i]是回文串,p[i][j]用来表示i-j之间是否是回文串,这个串可以通过p数组来直接访问。

需要注意的是:提交到leetcode的时候需要用向量,将p和dp替换成向量,否则会Runtime Error.

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<iomanip>
using namespace std;
int p[1600][1600];
int dp[1600];
int minCut(string s) {
    memset(p,0,sizeof(p));
    memset(dp,0,sizeof(dp));
    int len=s.length(),i,j;
    for(i=0;i<len;i++) p[i][i]=1;
    for(i=0;i+1<len;i++)
        if(s[i]==s[i+1])
            p[i][i+1]=1;
    for(i=3;i<=len;i++){
        for(j=0;j+i-1<len;j++)
            if(s[j]==s[j+i-1]&&p[j+1][j+i-2]==1)
                p[j][j+i-1]=1;
    }
    int tmp;
    for(i=1;i<len;i++){
        if(p[0][i]==1){
            dp[i]=0;
            continue;
        }
    	tmp=0x7fffffff;
        for(j=0;j<i;j++){
            if(p[j+1][i]==1){
                if(tmp>dp[j]+1)
                    tmp=dp[j]+1;
                }
            }
            dp[i]=tmp;
        }
    return dp[len-1];
}
int main(){
    cout<<minCut(tmp);
	system("pause");
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: