四维DP「每日一题」

集训队训练⑧ - Virtual Judge

题意:一个矩阵,从左上走到右下的最大权重和「两条路」

可以开一个四维数组,因为数据量太小了

对每种情况都进行遍历,然后找不重复的点

#include <iostream>

using namespace std;
int n;
int a[15][15];
int dp[15][15][15][15];
int main() {
	cin>>n;
	int x,y,val;
	while(scanf("%d",&x)!=EOF){
		if(x==0) break;
		cin>>y>>val;
		a[x][y]=val;
	}
//	int k,z;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int k=1;k<=n;k++){
				for(int m=1;m<=n;m++){
					dp[i][j][k][m] = max(dp[i-1][j][k-1][m],dp[i][j-1][k][m-1]) + a[i][j];
					dp[i][j][k][m] = max(dp[i][j][k][m],dp[i-1][j][k][m-1] + a[i][j]);
					dp[i][j][k][m] = max(dp[i][j][k][m],dp[i][j-1][k-1][m] + a[i][j]);
					if(i!=k&&j!=m) dp[i][j][k][m]+=a[k][m];
				}
			}
		}
	}
	cout<<dp[n][n][n][n]<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_60789461/article/details/123390547