区间dp50分样例不过求调
查看原帖
区间dp50分样例不过求调
746104
zzs2731楼主2023/11/19 10:31
#include<bits/stdc++.h>
using namespace std;
string s;
int n;
int dp[150][150];
int f(int x){
	int cnt=0;
	while(x){
		x/=10;
		cnt++;
	}
	return cnt;
}
bool check(int l,int r,int k){
	int len=k-l+1;
//	cout<<endl;       
//	cout<<l<<' '<<r<<endl;
//	cout<<len<<endl;
	for(int i=l;i<=r;i++){
//		cout<<i-1<<' '<<i%len<<endl;
		if(s[i-1]!=s[i%len]){
//			cout<<"NO"<<endl; 
			return 0;
		}
	}
	return 1;
}
int main(){
	cin>>s;
	n=s.size();
	memset(dp,0x3f,sizeof(dp));
	for(int i=1;i<=n;i++)dp[i][i]=1;
	for(int len=1;len<=n;len++){
		for(int l=1,r;l+len-1<=n;l++){
			r=l+len-1;
//			cout<<l<<' '<<r<<endl;
			for(int k=l;k<r;k++){
//				cout<<k<<endl;
//				cout<<dp[l][r]<<' '<<dp[l][k]+dp[k+1][r]<<endl;
//				cout<<endl;
				dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]);
				
				if(!(len%(k-l+1))){
					if(check(l,r,k)){
//						cout<<l<<' '<<k<<' '<<r<<' '<<k-l+3+f(len/(k-l+1))<<endl;
						dp[l][r]=min(dp[l][r],k-l+3+f(len/(k-l+1)));	
					}
				}
			}
//			cout<<dp[l][r]<<endl;
			
//			cout<<endl;
		}
	}
	cout<<dp[1][n]; 
	return 0;
} 
//样例输入:NEERCYESYESYESNEERCYESYESYES
//我的输出:28 

评测记录

2023/11/19 10:31
加载中...