zoukankan      html  css  js  c++  java
  • 51nod 1154 dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1154

    1154 回文串划分

    基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
    收藏
    关注
    有一个字符串S,求S最少可以被划分为多少个回文串。
    例如:abbaabaa,有多种划分方式。
     
    a|bb|aabaa - 3 个回文串
    a|bb|a|aba|a - 5 个回文串
    a|b|b|a|a|b|a|a - 8 个回文串
     
    其中第1种划分方式的划分数量最少。
    Input
    输入字符串S(S的长度<= 5000)。
    Output
    输出最少的划分数量。
    Input示例
    abbaabaa
    Output示例
    3
    原本以为N^2会爆炸后来发现好像也不会= =倒是题意搞懵逼我了,题意是必须全部划分为回文子串,求最少划分几个,我以为可以出现非回文子串,就是0......天真
    dp[i]表示前i个字符的答案,第i个字符可能单独也可能与前面的某一串相连构成一个回文串,答案就是 dp[i]=MIN{dp[j]+1 | j<i&&j+1--i构成回文串}
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define LL long long
     4 #define inf 0x3f3f3f3f
     5 LL mod=1e9+7;
     6 int dp[5005];
     7 char s[5005];
     8 bool ok(int a,int b)
     9 {
    10     int m=b-((b-a)>>1);
    11     for(int i=a,j=b;i<=m;++i,--j)
    12         if(s[i]!=s[j]) return 0;
    13     return 1;
    14 }
    15 int main()
    16 {
    17     int N,i,j;
    18     scanf("%s",s+1);
    19     N=strlen(s+1);
    20     for(i=1;i<=N;++i)
    21     {
    22         dp[i]=dp[i-1]+1;
    23         for(j=0;j<i;++j)
    24         {
    25             if(ok(j+1,i)&&dp[i]>dp[j]+1) dp[i]=dp[j]+1;
    26         }
    27     }
    28     printf("%d
    ",dp[N]);
    29     return 0;
    30 }
  • 相关阅读:
    kafka 常见面试题
    分布式-redis实现分布式锁
    java info信息中打印异常堆栈
    11.盛水最多的容器
    445.两数相加
    328. 奇偶链表
    7中join查询
    Linux基础学习05
    Linux基础学习04
    Linux基础学习03
  • 原文地址:https://www.cnblogs.com/zzqc/p/7397123.html
Copyright © 2011-2022 走看看