zoukankan      html  css  js  c++  java
  • 区间DP+next求循环节 uva 6876

     1 // 区间DP+next求循环节 uva 6876
     2 // 题意:化简字符串 并表示出来
     3 // 思路:dp[i][j]表示 i到j的最小长度
     4 // 分成两部分 再求一个循环节
     5 
     6 #include <iostream>
     7 #include <algorithm>
     8 #include <cstring>
     9 #include <cstdio>
    10 #include <vector>
    11 #include <cmath>
    12 #include <map>
    13 #include <queue>
    14 using namespace std;
    15 #define LL long long
    16 typedef pair<int,int> pii;
    17 const int inf = 0x3f3f3f3f;
    18 const int MOD = 998244353;
    19 const int N = 1020;
    20 const int maxx = 200010; 
    21 #define clc(a,b) memset(a,b,sizeof(a))
    22 const double eps = 0.025;
    23 void fre() {freopen("in.txt","r",stdin);}
    24 void freout() {freopen("out.txt","w",stdout);}
    25 inline int read() {int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch=getchar();}while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;}
    26 
    27 char s[N];
    28 int dp[N][N];
    29 int cas=1;
    30 int nextt[N];
    31 
    32 int getnext(char *t,int len){
    33     int i=0,j=-1;
    34     // int len=strlen(t);
    35     nextt[0]=-1;
    36     while(i<len){
    37         if(t[i]==t[j]||j==-1){
    38             i++;
    39             j++;
    40             nextt[i]=j;
    41         }
    42         else
    43             j=nextt[j];
    44     }
    45     return len-nextt[len];
    46 }
    47 
    48 int getbit(int x){
    49     int cnt=0;
    50     while(x){
    51         x/=10;
    52         cnt++;
    53     }
    54     return cnt;
    55 }
    56 void DP(){
    57     int n=strlen(s+1);
    58     for(int i=1;i<=n;i++) {
    59         for(int j=i+1;j<=n;j++)
    60            dp[i][j]=1010;
    61         dp[i][i]=1;
    62     }
    63     for(int len=2;len<=n;len++){
    64         for(int l=1;l+len-1<=n;l++){
    65             int r=l+len-1;
    66             for(int k=l;k<r;k++){
    67                 dp[l][r]=min(dp[l][k]+dp[k+1][r],dp[l][r]);
    68             }
    69             int t=getnext(s+l,len);
    70             if((len%t)==0){
    71                 int tem=dp[l][l+t-1];
    72                 if(t>1) tem+=2;
    73                 tem+=getbit(len/t);
    74                 dp[l][r]=min(dp[l][r],tem);
    75             }
    76         }
    77     }
    78     printf("Case %d: %d
    ",cas++,dp[1][n]);
    79 }
    80 int main(){
    81     // fre();
    82     while(~scanf("%s",s+1)){
    83         if(s[1]=='0') break;
    84         DP();
    85     }
    86     return 0;
    87 }
  • 相关阅读:
    MFC中添加ToolTip提示框
    神经网络算法程序
    DOS命令大全(经典收藏)
    axure团队合作开发原型图
    POJ 3233 Matrix Power Series(矩阵高速功率+二分法)
    了解你的家公家IP
    HDOJ 3518 Boring counting
    模板方法模式的房间改造-组合查询
    6最好的之一 HTML5/CSS3 演示(PPT)框架
    试想一下,在代码学习Swift!
  • 原文地址:https://www.cnblogs.com/ITUPC/p/5876116.html
Copyright © 2011-2022 走看看