2 条题解

  • 0
    @ 2025-10-8 16:57:00
    #include <bits/stdc++.h>
    using namespace std;
    char ch[110];
    int dp[110][110],a,b,k[110][110],cut[110][110];
    bool check(int l,int r,int len);
    int ws(int n);
    void dfs(int l,int r);
    int main(){
    
        while(scanf("%s",ch+1)!=EOF){
            a=strlen(ch+1);
            memset(dp,0,sizeof(dp));
            memset(k,0,sizeof(k));
            memset(cut,0,sizeof(cut));
            for(int len=1;len<=a;len++){
                for(int l=1;l+len-1<=a;l++){
                    int r=l+len-1;
                    dp[l][r]=len;
                    for(int i=l;i<=r;i++){
                        if(dp[l][r]>dp[l][i]+dp[i+1][r]){
                            k[l][r]=0;
                            dp[l][r]=dp[l][i]+dp[i+1][r];
                            cut[l][r]=i+1;
                        }
                        int llen=i-l+1;
                        for(int ys=1;ys<=sqrt(llen);ys++){
                            if(llen%ys) continue;
                            if(check(l,i,ys)){
                                if(dp[l][r]>ws(llen/ys)+2+dp[l][l+ys-1]+dp[i+1][r]){
                                    k[l][r]=llen/ys,cut[l][r]=l+llen/ys;
                                    dp[l][r]=ws(llen/ys)+2+dp[l][l+ys-1]+dp[i+1][r];
                                }
                            } 
                            if(check(l,i,llen/ys)){
                                if(dp[l][r]>ws(ys)+2+dp[l][l+llen/ys-1]+dp[i+1][r]){
                                    k[l][r]=ys,cut[l][r]=l+llen/ys;
                                    dp[l][r]=ws(ys)+2+dp[l][l+llen/ys-1]+dp[i+1][r];
                                }
                            }
                        }
                    }
                }
            }
            dfs(1,a);
            putchar('\n');
        }
        return 0;
    }
    bool check(int l,int r,int len){
        for(int i=l;i+len<=r;i++){
            if(ch[i]!=ch[i+len]) return false;
        }
        return true;
    }
    int ws(int n){
        int ans=0;
        while(n) ans++,n/=10;
        return ans; 
    }
    void dfs(int l,int r){
        if(k[l][r]){//如果有一个倍数 
            cout << k[l][r] << "(";//先输出倍数和一半括号 
            int rr=l+(r-l+1)/k[l][r]-1;
            dfs(l,rr);//只用递归它的循环节 
            cout << ")" ;//输出另外一半括号 
            return ;
        }
        if(!k[l][r]&&!cut[l][r]){//既没有断点又没有倍数,要直接输出 
            for(int i=l;i<=r;i++) cout << ch[i];
            return ;
        }
        dfs(l,cut[l][r]-1);//其他一半一半继续 
        dfs(cut[l][r],r);
        return ;
    }
    
    • 0
      @ 2025-10-8 16:56:40
      #include<bits/stdc++.h>
      using namespace std;
      char ch[110];
      int dp[110][110],a,b,k[110][110],cut[110][110];
      bool check(int l,int r,int len);
      int ws(int n);
      void dfs(int l,int r);
      int main(){
      
      	while(scanf("%s",ch+1)!=EOF){
      		a=strlen(ch+1);
      		memset(dp,0,sizeof(dp));
      		memset(k,0,sizeof(k));
      		memset(cut,0,sizeof(cut));
      		for(int len=1;len<=a;len++){
      			for(int l=1;l+len-1<=a;l++){
      				int r=l+len-1;
      				dp[l][r]=len;
      				for(int i=l;i<=r;i++){
      					if(dp[l][r]>dp[l][i]+dp[i+1][r]){
      						k[l][r]=0;
      						dp[l][r]=dp[l][i]+dp[i+1][r];
      						cut[l][r]=i+1;
      					}
      					int llen=i-l+1;
      					for(int ys=1;ys<=sqrt(llen);ys++){
      						if(llen%ys) continue;
      						if(check(l,i,ys)){
      							if(dp[l][r]>ws(llen/ys)+2+dp[l][l+ys-1]+dp[i+1][r]){
      								k[l][r]=llen/ys,cut[l][r]=l+llen/ys;
      								dp[l][r]=ws(llen/ys)+2+dp[l][l+ys-1]+dp[i+1][r];
      							}
      						} 
      						if(check(l,i,llen/ys)){
      							if(dp[l][r]>ws(ys)+2+dp[l][l+llen/ys-1]+dp[i+1][r]){
      								k[l][r]=ys,cut[l][r]=l+llen/ys;
      								dp[l][r]=ws(ys)+2+dp[l][l+llen/ys-1]+dp[i+1][r];
      							}
      						}
      					}
      				}
      			}
      		}
      		dfs(1,a);
      		putchar('\n');
      	}
      	return 0;
      }
      bool check(int l,int r,int len){
      	for(int i=l;i+len<=r;i++){
      		if(ch[i]!=ch[i+len]) return False;
      	}
      	return True;
      }
      int ws(int n){
      	int ans=0;
      	while(n) ans++,n/=10;
      	return ans; 
      }
      void dfs(int l,int r){
      	if(k[l][r]){//如果有一个倍数 
      		cout<<k[l][r]<<"(";//先输出倍数和一半括号 
      		int rr=l+(r-l+1)/k[l][r]-1;
      		dfs(l,rr);//只用递归它的循环节 
      		cout<<")";//输出另外一半括号 
      		return ;
      	}
      	if(!k[l][r]&&!cut[l][r]){//既没有断点又没有倍数,要直接输出 
      		for(int i=l;i<=r;i++) cout<<ch[i];
      		return ;
      	}
      	dfs(l,cut[l][r]-1);//其他一半一半继续 
      	dfs(cut[l][r],r);
      	return ;
      }
      • 1

      0x50 动态规划(练习)8:[UVA1630] 串折叠 Folding(spj)

      信息

      ID
      1406
      时间
      1000ms
      内存
      512MiB
      难度
      6
      标签
      递交数
      17
      已通过
      11
      上传者