开 O2 AC,不开 O2 WA 第一个点???
查看原帖
开 O2 AC,不开 O2 WA 第一个点???
124740
ethan_zhou楼主2020/11/18 11:17

如题,代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

const int MXN=605;
int n,k;
int arr[MXN][MXN],ans[MXN];
int dp[MXN][MXN],pre[MXN][MXN];
inline int cal(int l,int r){return arr[r-1][n]-arr[l-1][n]-arr[r-1][r-1]+arr[l-1][r-1];}
int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<n;i++)
		for(int j=i+1;j<=n;j++)
			scanf("%d",&arr[i][j]);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			arr[i][j]+=arr[i-1][j]+arr[i][j-1]-arr[i-1][j-1];
	memset(dp,~0x3f,sizeof(dp));
	dp[0][0]=0;
	for(int i=1;i<=n;i++){
		dp[i][0]=1;
		int tmp;
		for(int j=1;j<=k && j<=i;j++)
			for(int l=j-1;l<i;l++)
				if((tmp=max(dp[i][j],dp[l][j-1]+cal(l,i)))>dp[i][j]){
					dp[i][j]=tmp;
					pre[i][j]=l;
				}
	}

	int pos=0;
	for(int i=1;i<=n;i++)
		if(dp[i][k]>dp[pos][k])
			pos=i;

	for(int i=k;i;i--){
		ans[i]=pos;
		pos=pre[pos][i];
	}
	for(int i=1;i<=k;i++)printf("%d ",ans[i]-1);
	return 0;
}

2020/11/18 11:17
加载中...