70 pts 求调
  • 板块题目总版
  • 楼主SilverLi
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/6/3 18:40
  • 上次更新2023/10/23 13:58:28
查看原帖
70 pts 求调
688783
SilverLi楼主2023/6/3 18:40

P4302 [SCOI2003]字符串折叠\texttt{P4302 [SCOI2003]}\text{字符串折叠}

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=105;
int n,num[N];
int f[N][N];
string s;
inline bool check(int l1,int r1,int l2,int r2) {
    int k=l1;
    for(int i=l2;i<=r2;++i) {
        if(s[i]!=s[k++]) return 0;
        if(k>r1)    k=l1;
    }
    return 1;
}
signed main() {
    cin>>s;
    n=s.size();
    s=" "+s;
    for(int i=1;i<=n;++i)   num[i]=num[i/10]+1;
    for(int i=1;i<=n;++i)   f[i][i]=1;
    for(int l=1;l<=n;++l)
        for(int i=1;i+l-1<=n;++i) {
            int j=i+l-1;
            f[i][j]=l;
            for(int k=i;k<j;++k) {
                f[i][j]=min(f[i][j],
                f[i][k]+f[k+1][j]);
                if(check(i,k,k+1,j))
                    f[i][j]=min(f[i][j],
                    f[i][k]+num[l/(k-i+1)]+2);
            }
        }
    cout<<f[1][n];
    return 0;
}
2023/6/3 18:40
加载中...