WA#15求助
查看原帖
WA#15求助
357641
YyuanDa楼主2020/11/25 20:08
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,ans=0;
int dp[55][55][505],sum[55][55];
//i,j,k:第i行取前j个,总共取了k个数 
void init(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n-i+1;j++) scanf("%d",&sum[n+1-j][i]);
	}
//	dp[1][1][1]=a[1][1],dp[1][0][0]=0;
	for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) sum[i][j]+=sum[i][j-1];
}

int main(){
	init();
//	cout<<"FUCK"<<endl;
	for(int i=1;i<=n;i++){
		for(int j=0;j<=i;j++){
			for(int k=j*(j+1)/2;k<=m;k++){//取了前j个就一定取了前j*(j+1)/2个数 
				int p1=max(j-1,0),p2=min(i-1,k-j);//防止越界 
				//p枚举上一行的取数情况 
				for(int p=p1;p<=p2;p++){
					dp[i][j][k]=max(dp[i][j][k],dp[i-1][p][k-j]+sum[i][j]);
					ans=max(ans,dp[i][j][k]);
				}
			}
		}
	}
	printf("%d",ans);
	return 0;
}
/*
4 5
2 2 3 4
8 2 7
2 3
49
*/
2020/11/25 20:08
加载中...