日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ 1090: [SCOI2003]字符串折叠 区间DP

發(fā)布時間:2025/3/17 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ 1090: [SCOI2003]字符串折叠 区间DP 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1090: [SCOI2003]字符串折疊

Time Limit: 1 Sec ?

Memory Limit: 256 MB

題目連接

http://www.lydsy.com/JudgeOnline/problem.php?id=1090

Description

折疊的定義如下: 1. 一個字符串可以看成它自身的折疊。記作S ? S 2. X(S)是X(X>1)個S連接在一起的串的折疊。記作X(S) ? SSSS…S(X個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 給一個字符串,求它的最短折疊。例如AAAAAAAAAABABABCCD的最短折疊為:9(A)3(AB)CCD。

Input

僅一行,即字符串S,長度保證不超過100。

Output

僅一行,即最短的折疊長度。

Sample Input

NEERCYESYESYESNEERCYESYESYES

Sample Output

14

HINT

?

題意

?

題解:

哎呦臥槽,這道題和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的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。