方格取数(普通dp)
设dp[i][j][l][k]表示走第一个走到i,j,第二个走到l,k,的最大值
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; int dp[11][11][11][11]; int a[100][100]; int main(){ int n; int x,y,z; cin>>n>>x>>y>>z; while(x!=0||y!=0||z!=0){ a[x][y]=z; cin>>x>>y>>z; } for (int i=1;i<=n;i++){ for (int j=1;j<=n;j++){ for (int l=1;l<=n;l++){ for (int k=1;k<=n;k++){ dp[i][j][l][k]=max(max(dp[i-1][j][l-1][k],dp[i-1][j][l][k-1]),max(dp[i][j-1][l-1][k],dp[i][j-1][l][k-1]))+a[i][j]+a[l][k]; if(i==l&&j==k) dp[i][j][l][k]-=a[i][j]; } } } } printf("%d\n",dp[n][n][n][n]); return 0; }