算法训练方格取数
#include<bits/stdc++.h> using namespace std; // 走两次是不行的,因为这就是贪心了。。 // 需要多线程dp,就是想象有2个人同时走,他们可以走到一起,但是必须只加一次; // 转移方程: // (1)a,b都从上/下走过来 // (2)a,b一个上一个下走过来 // 共4种 //dp 数组代表a到哪,b到哪,可以不一样 int dp[11][11][11][11]={0},a[11][11]={0}; int main() { int n,x,y,z,s; cin>>n; while(1){ cin>>x>>y>>z; if(x==y&&y==z&&z==0) break; a[x][y]=z; } for( int x1 = 1; x1 <= n; x1++ ) { for( int y1 = 1; y1 <= n; y1++ ) { for( int x2 = 1; x2 <= n; x2++ ) { for( int y2 = 1; y2 <= n; y2++ ){ int t=max(dp[x1-1][y1][x2-1][y2],dp[x1][y1-1][x2][y2-1]); t=max(t,dp[x1-1][y1][x2][y2-1]); t=max(t,dp[x1][y1-1][x2-1][y2]); if(x1==x2&&y1==y2){ //代表到达同一位置,只能,加一次,每次都这样,就保证了前面的也不会重复加 dp[x1][y1][x2][y2]=t+a[x1][y1]; } else dp[x1][y1][x2][y2]=t+a[x1][y1]+a[x2][y2]; } } } } cout<<dp[n][n][n][n]<<endl; return 0; }