奇怪的70分dp,求调教
  • 板块P1874 快速求和
  • 楼主zrx114
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/5 18:03
  • 上次更新2024/7/5 20:19:12
查看原帖
奇怪的70分dp,求调教
866487
zrx114楼主2024/7/5 18:03

蚌埠住了,看了一下午

#include<bits/stdc++.h>
using namespace std;
string s;
int n;
int num[45][45];
int dp[45][100005];//长度为i,和为j所需最少的加号数量
int main(){
	//freopen("candy.in","r",stdin);
	//freopen("candy.out","w",stdout);
	cin>>s;
	cin>>n;
	s=" "+s;
	for(int i=1;i<s.size();i++){
		for(int j=i;j<s.size();j++){
			num[i][j]=num[i][j]*10+(s[j]-'0');
			if(num[i][j]>n){
				break;
			}
//			cout<<num[i+1][j+1]<<" ";
		}
	}
//	cout<<endl;
	memset(dp,0x3f,sizeof(dp));
	dp[0][0]=-1;
	for(int i=1;i<s.size();i++){
		for(int j=0;j<=n;j++){
			for(int k=i;k>0 && num[k][i]<=j;k--){
				dp[i][j]=min(dp[i][j],dp[k-1][j-num[k][i]]+1);
//				cout<<dp[i][j]<<" ";
			}
		}
	}
	if(dp[s.size()-1][n]<45){
		cout<<dp[s.size()-1][n];
	}
	else{
		cout<<"-1";
	}
	return 0;
}
2024/7/5 18:03
加载中...