为什么这样能过?
查看原帖
为什么这样能过?
841638
Igunareo楼主2024/7/9 19:29
#include<bits/stdc++.h>
#define int long long
using namespace std;
int f[105][105];
int l[105][105];
int ldp[105][105];
int rdp[105][105];
int dp[105][105];
int mpow(int a,int p){
	int ans=1;
	while(p){
		if(p&1)ans=ans*a%998244353;
		a=a*a%998244353;
		p=p/2;
	}
	return ans;
}
int logg(int now){
	int ans=1;
	while(now>=10){
		now=now/10;
		ans++;
	}
	return ans;
}
signed main(){
	string s;
	getline(cin,s);
	for(int i=0;i<s.size();i++){
		f[i+1][i+1]=(int)(s[i]);
		l[i+1][i+1]=1;
	}
	int n=s.size();
	for(int k=2;k<=n;k++){
		for(int i=1;i<=n-k+1;i++){
			f[i][i+k-1]=(f[i][i]*mpow(256,k-1)+f[i+1][i+k-1])%998244353;
		}
	}
	for(int i=1;i<=n;i++)ldp[i][i]=rdp[i][i]=i;
	for(int k=2;k<=n;k++){
		for(int i=1;i<=n-k+1;i++){
			l[i][i+k-1]=k;
			ldp[i][i+k-1]=i;
			rdp[i][i+k-1]=i+k-1;
			for(int j=i;j<i+k-1;j++){
				if(f[i][j]==f[j+1][i+k-1]){
					if(l[i][j]<l[i][i+k-1]){
						l[i][i+k-1]=l[i][j];
						f[i][i+k-1]=f[i][j];
						ldp[i][i+k-1]=ldp[i][j];
						rdp[i][i+k-1]=rdp[i][j];
					}
				}
			}
		}
	}
	for(int i=1;i<=n;i++)dp[i][i]=1;
	for(int k=2;k<=n;k++){
		for(int i=1;i<=n-k+1;i++){
			dp[i][i+k-1]=k;
			for(int j=i;j<i+k-1;j++)dp[i][i+k-1]=min(dp[i][i+k-1],dp[i][j]+dp[j+1][i+k-1]);
			dp[i][i+k-1]=min(dp[i][i+k-1],dp[ldp[i][i+k-1]][rdp[i][i+k-1]]+2+logg(k/l[i][i+k-1]));
		}
	}
	printf("%lld",dp[1][n]);
	return 0;
} 
2024/7/9 19:29
加载中...