原题链接:蓝桥杯算法训练VIP-方格取数
#include<iostream>
#include<string.h>
using namespace std;
/*dp[i][j][m][n]:点(1,1)到点(i,j)和(m,n)最大长度和
dp[i][j][m][n] = max(max(dp[i-1][j][m-1][n],dp[i-1][j][m][n-1]),
max(dp[i][j-1][m-1][n],dp[i][j-1][m][n-1]))
+map[i][j]+map[m][n];(当i!=m&&j!=n)
当i==m,j==n,重复取值减去一个map[i][j]
*/
int map[11][11];
int dp[11][11][11][11]={0};
int main(){
int N,x,y,z;
cin>>N;
memset(map,0,sizeof(map));
while(cin>>x>>y>>z){
if(x==0)break;
map[x][y]=z;
}
for(int i = 1;i <= N;i++)
for(int j = 1;j <= N;j++)
for(int m = 1;m <= N;m++)
for(int n = 1;n <= N;n++){
dp[i][j][m][n] = max(max(dp[i-1][j][m-1][n],dp[i-1][j][m][n-1]),max(dp[i][j-1][m-1][n],dp[i][j-1][m][n-1]))+map[i][j]+map[m][n];
if(i == m && j == n)
dp[i][j][m][n] -= map[i][j];
}
cout<<dp[N][N][N][N]<<endl;
}
9.9 分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复