70分,区间dp,我知道错误但是不知道怎么改
  • 板块P1281 书的复制
  • 楼主Phrvth
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/8/20 21:22
  • 上次更新2023/10/27 14:23:09
查看原帖
70分,区间dp,我知道错误但是不知道怎么改
520544
Phrvth楼主2022/8/20 21:22

题目中有个限制就很~~***~~

尽可能让前面的人少抄写

我不知道咋调(代码有点丑

#include<bits/stdc++.h>

using namespace std;
int m,k,a[150],dp[150][150][150],w[150];
int ans[150][150][150];
void print(int l,int r,int q){
	if(q==0)return ;
	print(l,ans[l][r][q]-1,q-1);
	cout<<ans[l][r][q]<<' '<<r<<endl;
}
int main()
{
	cin>>m>>k;
	for(int i=1;i<=m;i++) cin>>a[i],w[i]=w[i-1]+a[i];
	memset(dp,0x3f,sizeof(dp));
	dp[0][0][0]=0;
	for(int i=1;i<=m;i++) dp[i][i][1]=a[i],ans[i][i][1]=i;;
	for(int i=1;i<=m;i++)
		for(int j=i;j<=m;j++)
			dp[i][j][0]=0,dp[i][j][1]=w[j]-w[i-1],ans[i][j][1]=i;
	for(int len=1;len<=m;len++)
		for(int i=1;i+len-1<=m;i++){
			int j=i+len-1;
			for(int k=i;k<j;k++)
				for(int q=2;q<=k;q++){
					if(dp[i][j][q]>max(dp[i][k][q-1],w[j]-w[k])){
						dp[i][j][q]=max(dp[i][k][q-1],w[j]-w[k]);
						ans[i][j][q]=k+1;
					} 
				}
		}
	print(1,m,k);
	return 0;
}
2022/8/20 21:22
加载中...