【混合dp I】Partitioning by Palindromes

2人阅读 评论(0) 收藏 举报
分类:

题目来源:


题目大意:
对于给定的字符串,找出里面回文子串最小的总数(也就是说单个回文子串要尽可能长)
规定单独一个字符可成为一个回文子串

解题思路:
dp,一维。
一开始习惯开了二维最后判断超麻烦,仔细想想其实一维就行了啊x

dp[i]:表示前i个字符里回文子串数最小的总数
状态转移方程:dp[i] = min(dp[i], dp[j-1]+1)
一开始dp[i]里的数值为i,即前i个字符里最多有i个回文子串
每次j都从字符的头开始,由于j-1,于是在字符串前应再加一个字符保证字符串的头下标为1,也方便计数。
虽然从0开始j-1奇怪地没出现越界(应该是j-1访问到s数组的最后去了吧),但结果微妙地不对呢x
AC代码:
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <set>
#include <stack>
#include <map>
#include <string>
#include <utility>
#include <string>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <list>
#define N 1010

using namespace std;

char s[N];
int dp[N];

int check(int i, int j)
{
    for (int k=j, g=i;k<g;k++,g--)
    {
        if (s[k]!=s[g])
        {
            return 0;
        }
    }
    return 1;
}

int main()
{
    int t;
    scanf("%d",&t);
    while (t--)
    {
        memset(dp,0,sizeof(dp));
        strcpy(s,"0");
        char t[N];
        scanf("%s",t);
        strcat(s,t);
        int len = strlen(s);
        for (int i=1;i<len;i++)
        {
            dp[i] = i;
            for (int j=1;j<=i;j++)
            {
                if (check(i, j))
                {
                    dp[i] = min(dp[i],dp[j-1]+1);
                }
            }
        }
        printf("%d\n",dp[len-1]);
    }
    return 0;
}

查看评论

那么到底什么是一个系统呢?(软工系列文章之五)

 那么到底什么是一个系统呢?What is a System Anyway?By Russ Finney翻译:方雨 一个系统是一套为完成一项业务而设计的的手动或者自动化过程。一些过程可能支持每月的信息...
  • jiangtao
  • jiangtao
  • 2001-02-10 09:01:00
  • 2083

leetCode解题报告之Palindrome Partitioning I,II(DFS,DP)

Palindrome Partitioning I, II DFS 和 DP动态规划问题 首先我们先定义几个变量,并对这几个量做一定的说明!为了方便理解,下面这些为伪码!!! len = s...
  • u011133213
  • u011133213
  • 2014-03-31 01:02:53
  • 20505

Leetcode: Palindrome Partitioning I & II

Problem I : Palindrome Partitioning I  Given a string s, partition s such that every substring of...
  • u011095253
  • u011095253
  • 2013-06-26 14:08:36
  • 4983

UVa 11584 Partitioning by Palindromes(DP 最少对称串)

题意  判断一个串最少可以分解为多少个对称串   一个串从左往后和从右往左是一样的  这个串就称为对沉串 令d[i]表示给定串的前i个字母至少可以分解为多少个对称串  那么对于j=1~i   若(i,...
  • acvay
  • acvay
  • 2014-08-25 15:07:18
  • 711

uva 11584 - Partitioning by Palindromes (dp)

题目链接http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2...
  • Wiking__acm
  • Wiking__acm
  • 2012-12-07 09:05:16
  • 1603

UVa11584 -Partitioningby Palindromes

UVa11584 -Partitioningby Palindromes   题意:给定一个字符串,求该字符串最少能被分为几个回文子串。 分析:很明显的区间dp,问题规模为判断1到n这n...
  • consciousman
  • consciousman
  • 2016-09-27 19:29:33
  • 316

UVA - 11584 Partitioning by Palindromes

题意:输入一个有小写字母组成的字符串,你的任务是将它划分成尽量少的回文串 思路:dp[i]代表到第i位的最小值,枚举它的前几位求出最小值,为了方便枚举整个长度我们 从str[1]开始输入 #inc...
  • u011345136
  • u011345136
  • 2013-12-20 18:41:36
  • 850

Partitioning by Palindromes(回文串-->字符串DP)

Partitioning by Palindromes We say a sequence of characters is a palindrome if it is the same wri...
  • junjie435
  • junjie435
  • 2014-10-09 19:41:25
  • 300

例题9-7 划分成回文串 UVa11584

1.题目描述:点击打开链接 2.解题思路:本题要求划分回文串,且个数尽可能的少。可以用动态规划解决。先提前判断i~j是否构成回文串,时间复杂度是O(N^2),然后定义d(i)表示0~i-1划分成的回文...
  • u014800748
  • u014800748
  • 2015-02-13 12:56:36
  • 615

1044 - Palindrome Partitioning(记忆化DP)

A palindrome partition is the partitioning of a string such that each separate substring is a palind...
  • Techay
  • Techay
  • 2016-03-09 23:22:32
  • 196
    个人资料
    持之以恒
    等级:
    访问量: 611
    积分: 193
    排名: 91万+
    文章存档