BZOJ 1090: [SCOI2003]字符串折叠 区间DP
生活随笔
收集整理的這篇文章主要介紹了
BZOJ 1090: [SCOI2003]字符串折叠 区间DP
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1090: [SCOI2003]字符串折疊
Time Limit: 1 Sec ?
Memory Limit: 256 MB
題目連接
http://www.lydsy.com/JudgeOnline/problem.php?id=1090Description
折疊的定義如下: 1. 一個(gè)字符串可以看成它自身的折疊。記作S ? S 2. X(S)是X(X>1)個(gè)S連接在一起的串的折疊。記作X(S) ? SSSS…S(X個(gè)S)。 3. 如果A ? A’, B?B’,則AB ? A’B’ 例如,因?yàn)?(A) = AAA, 2(B) = BB,所以3(A)C2(B) ? AAACBB,而2(3(A)C)2(B)?AAACAAACBB 給一個(gè)字符串,求它的最短折疊。例如AAAAAAAAAABABABCCD的最短折疊為:9(A)3(AB)CCD。
Input
僅一行,即字符串S,長(zhǎng)度保證不超過(guò)100。
Output
僅一行,即最短的折疊長(zhǎng)度。
Sample Input
NEERCYESYESYESNEERCYESYESYES
Sample Output
14HINT
?
題意
?
題解:
哎呦臥槽,這道題和http://www.cnblogs.com/qscqesze/p/4782156.html這道題一模一樣……
雙倍經(jīng)驗(yàn)爽呀!
代碼:
//qscqesze #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <bitset> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> #include <stack> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define maxn 110000 #define mod 10007 #define eps 1e-9 #define pi 3.1415926 int Num; //const int inf=0x7fffffff; //§?§é§à§é¨f§3 const ll Inf=0x3f3f3f3f3f3f3f3fll; inline ll read() {ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f; } //**************************************************************************************string s[110][110]; int n; int dp[110][110]; int vis[110][110]; char S[110]; int FF(int x) {int add=0;while(x){add++;x/=10;}return add; } string F(int x) {string ss;while(x){ss+=(char)(x%10+'0');x/=10;}reverse(ss.begin(),ss.end());return ss; } int solve(int l,int r) {if(vis[l][r])return dp[l][r];vis[l][r]=1;for(int i=l;i<r;i++){if(dp[l][r]>solve(l,i)+solve(i+1,r)){dp[l][r]=dp[l][i]+dp[i+1][r];s[l][r]=s[l][i]+s[i+1][r];}}for(int i=1;i<r-l+1;i++){if((r-l+1)%(i)!=0)continue;int add = 0;for(int k=0;;k++){if((k+1)*i>r-l+1)break;for(int j=0;j<i;j++){if(S[l+k*i+j]!=S[l+j])break;if(j==i-1)add+=1;}}if(add==(r-l+1)/i){int point=solve(l,l+i-1)+2+FF(add);if(dp[l][r]>point){dp[l][r]=point;s[l][r]="";s[l][r]+=F(add)+'(';s[l][r]+=s[l][(1)*i-1+l];s[l][r]+=')';}}}return dp[l][r]; } int main() {scanf("%s",S+1);n = strlen(S+1);for(int i=1;i<=n;i++){for(int j=i;j<=n;j++){dp[i][j]=j-i+1;for(int k=0;k<j-i+1;k++){s[i][j]+=S[i+k];}}}solve(1,n);cout<<dp[1][n]<<endl;return 0; }?
總結(jié)
以上是生活随笔為你收集整理的BZOJ 1090: [SCOI2003]字符串折叠 区间DP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Excel 2016新增函数之IFS
- 下一篇: 《利用python进行数据分析》读书笔记