四维DP!
四维DP!
四维DP!
为啥不开俩二维呢,是因为压根对应不起来..............方程:max(max(dp[i-1][j][k-1][t],dp[i-1][j][k][t-1]),max(dp[i][j-1][k][t-1],dp[i][j-1][k-1][t]))+a[i][j]+a[k][t]。去找往下,往右走哪个大.......
代码:
#include<bits/stdc++.h> using namespace std; int dp[11][11][11][11]; int x,y,z; int a[11][11]; int n,m; int main() { cin>>n; cin>>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 k=1;k<=n;k++) { for(int t=1;t<=n;t++) { dp[i][j][k][t]=max(max(dp[i-1][j][k-1][t],dp[i-1][j][k][t-1]),max(dp[i][j-1][k][t-1],dp[i][j-1][k-1][t]))+a[i][j]+a[k][t]; if(i==k&&j==t) dp[i][j][k][t]-=a[i][j];//特判,走的路不能重,不然这个点你会算两遍 } } } } cout<<dp[n][n][n][n];//输出 }