1. 程式人生 > 其它 >DP數字三角形變形——方格取數

DP數字三角形變形——方格取數

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;
}