DP數字三角形變形——方格取數
阿新 • • 發佈:2021-07-12
DP數字三角形變形——方格取數
設有 N×N 的方格圖,我們在其中的某些方格中填入正整數,而其它的方格中則放入數字0。如下圖所示:
某人從圖中的左上角 A 出發,可以向下行走,也可以向右行走,直到到達右下角的 B 點。
在走過的路上,他可以取走方格中的數(取走後的方格中將變為數字0)。
此人從 A 點到 B 點共走了兩次,試找出兩條這樣的路徑,使得取得的數字和為最大。
思路:
儘可能減少變數(狀態數)來降低空間的使用
原先的四維陣列
f[路線一的橫座標][路線一的縱座標][路線二的橫座標][路線二的縱座標]
x1+y1=x2+y2=t
,t相當於一套換演算法則,x1,x2相當於輸入的資訊,而y1,y2是通過這套換取來的結果。
所以可以建立三維陣列來換取空間的優化
f[曼哈頓距離][路線一的橫座標][路線二的橫座標]
#include<bits/stdc++.h> using namespace std; int main() { int n; cin>>n; int a[n+1][n+1]; for(int i=0;i<=n+1;i++) for(int j=0;j<=n+1;j++) a[i][j]=0; while(1) { int x,y,z; cin>>x>>y>>z; if(x==0&&y==0&&z==0) break; a[x][y]=z; } int f[n+n+10][n+10][n+10]; for(int i=0;i<2*n+5;i++) { for(int j=0;j<n+5;j++) for(int k=0;k<n+5;k++) f[i][j][k]=0; } for(int i=1;i<=2*n-1;i++) for(int j=1;j<=i;j++) for(int k=1;k<=i;k++) { int add=a[j][i-j+1]+a[k][i-k+1]; if(j==k) { add=add-a[j][i-j+1]; } f[i][j][k]=max(f[i-1][j][k]+add, f[i][j][k]); f[i][j][k]=max(f[i-1][j-1][k]+add,f[i][j][k]); f[i][j][k]=max(f[i-1][j][k-1]+add, f[i][j][k]); f[i][j][k]=max(f[i-1][j-1][k-1]+add, f[i][j][k]); } cout<<f[2*n-1][n][n]; return 0; }