1. 程式人生 > >luogu P1004 方格取數

luogu P1004 方格取數

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 方格取數