30pts , 找不到错误
查看原帖
30pts , 找不到错误
405894
233L楼主2021/7/28 14:31
#include<bits/stdc++.h>
#define N 104
#define M 4
#define K 14
using namespace std;
int n,m,k,ans=-INT_MAX;
int a[N][M];
int dp[N][K][3];
/*dp[][][i],i=
0 both
1 left
2 right
*/


void init(){
	scanf("%d%d%d",&n,&m,&k);
	
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			scanf("%d",&a[i][j]);
		}
}
int main(){
	init();
	
	int op;
	if(m^2)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=min(k,i);j++){
				dp[i][j][0]=dp[i-1][j][0];
				for(int k=j-1;k<i;k++)
					dp[i][j][0]=max(dp[i][j][0],dp[k][j-1][0]);
				dp[i][j][0]+=a[i][1];
				ans=max(ans,dp[i][j][0]);
			}
	else
		for(int i=1;i<=n;i++)
			for(int j=1;j<=min(k,i<<1);j++){
				op=-INT_MAX;
				
				dp[i][j][0]=dp[i-1][j][0];
				dp[i][j][1]=dp[i-1][j][1];
				dp[i][j][2]=dp[i-1][j][2];
				
				dp[i][j][1]=max(dp[i][j][1],dp[i-1][j][0]);
				dp[i][j][2]=max(dp[i][j][2],dp[i-1][j][0]);
				
				for(int k=j-1;k<i;k++){
					op=max(op,dp[k][j-1][0]);
					op=max(op,dp[k][j-1][1]);
					op=max(op,dp[k][j-1][2]);
				}
				
				dp[i][j][0]=max(dp[i][j][0],op);
				dp[i][j][1]=max(dp[i][j][1],op);
				dp[i][j][2]=max(dp[i][j][2],op);
				
				//dp[i][j][1]=max(dp[i][j][1],max(op,dp[i][j-1][2]));
				//dp[i][j][2]=max(dp[i][j][2],max(op,dp[i][j-1][1]));
				
				dp[i][j][0]+=a[i][1]+a[i][2];
				dp[i][j][1]+=a[i][1];
				dp[i][j][2]+=a[i][2];
			}
	
	for(int i=1;i<=n;i++){
		ans=max(ans,dp[i][k][0]);
		ans=max(ans,dp[i][k][1]);
		ans=max(ans,dp[i][k][2]);
	}
	
	printf("%d",ans);
}

大概解释一下我的程序吧。

dp[i][j][k] 表示考虑到了第 i 行,选取了 j 个矩阵,k 的含义写在注释里了,就是第 i 行具体取了哪几个数。

ps:看了一下题解,发现大家在状态的表示中都有将“两列都选,且属于同一个矩阵”和“两列都选,但不属于同一个矩阵”作区分,但我没有QAQ

我的处理方法在第46、47行,也就是只选一个可以由两个都选转移而来。

不知道问题会不会出在这里,希望有大佬帮忙看看(给几组数据也好啊

2021/7/28 14:31
加载中...