luogu P1004 方格取數
阿新 • • 發佈:2017-06-19
pre style ret 正整數 names noi span max ans
題目描述
設有N*N的方格圖(N<=9),我們將其中的某些方格中填入正整數,而其他的方格中則放
人數字0。如下圖所示(見樣例):
A
0 0 0 0 0 0 0 0
0 0 13 0 0 6 0 0
0 0 0 0 7 0 0 0
0 0 0 14 0 0 0 0
0 21 0 0 0 4 0 0
0 0 15 0 0 0 0 0
0 14 0 0 0 0 0 0
0 0 0 0 0 0 0 0
. B
某人從圖的左上角的A點出發,可以向下行走,也可以向右走,直到到達右下角的B
點。在走過的路上,他可以取走方格中的數(取走後的方格中將變為數字0)。
此人從A點到B點共走兩次,試找出2條這樣的路徑,使得取得的數之和為最大。
輸入輸出格式
輸入格式:
輸入的第一行為一個整數N(表示N*N的方格圖),接下來的每行有三個整數,前兩個
表示位置,第三個數為該位置上所放的數。一行單獨的0表示輸入結束。
輸出格式:
只需輸出一個整數,表示2條路徑上取得的最大的和。
輸入輸出樣例
輸入樣例#1:8 2 3 13 2 6 6 3 5 7 4 4 14 5 2 21 5 6 4 6 3 15 7 2 14 0 0 0輸出樣例#1:
67
說明
NOIP 2000 提高組第四題
補題解.兩條路一塊跑。
if(i==l&&j==k) f[i][j][l][k]-=sum[l][k];
前去不重合
#include<iostream> #include<cstdio> using namespace std; const int N = 51; int m,n,x,y,sum[N][N],ans; int num[N][N],f[N][N][N][N],vis[N][N]; int main() { cin>>m; int a,b,c; while(cin>>a>>b>>c) {if(a==0&&b==0&&c==0)break; else sum[a][b]=c; } for(int i=1; i<=m; i++) { for(int j=1; j<=m; j++) { for(int l=1; l<=m; l++) { for(int k=1; k<=m; k++) { if(i+j!=l+k) continue; f[i][j][l][k] = max(f[i][j][l][k],f[i-1][j][l-1][k]); f[i][j][l][k] = max(f[i][j][l][k],f[i][j-1][l][k-1]); f[i][j][l][k] = max(f[i][j][l][k],f[i-1][j][l][k-1]); f[i][j][l][k] = max(f[i][j][l][k],f[i][j-1][l-1][k]); f[i][j][l][k]+=sum[i][j]+sum[l][k]; if(i==l&&j==k) f[i][j][l][k]-=sum[l][k]; } } } } cout<<f[m][m][m][m]<<endl; return 0; }
luogu P1004 方格取數