zoukankan      html  css  js  c++  java
  • 方格取数

    题目描述

    设有N imes NN×N的方格图(N le 9)(N9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字00。如下图所示(见样例):

    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
    

    某人从图的左上角的AA点出发,可以向下行走,也可以向右走,直到到达右下角的BB点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字00)。
    此人从AA点到BB点共走两次,试找出22条这样的路径,使得取得的数之和为最大。

    输入格式

    输入的第一行为一个整数NN(表示N imes NN×N的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的00表示输入结束。

    输出格式

    只需输出一个整数,表示22条路径上取得的最大的和。

    输入输出样例

    输入 #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 提高组第四题

    我们考虑两个人同时走,就相当于数字三角形。状态转移方程为:

    f[i][j][k][l]=max(f[i-1][j][k-1][l],f[i-1][j][k][l-1],f[i][j-1][k-1][l],f[i][j-1][k][l-1])+a[i][j]+a[k][l];f[i][j][k][l]=max(f[i1][j][k1][l],f[i1][j][k][l1],f[i][j1][k1][l],f[i][j1][k][l1])+a[i][j]+a[k][l];

    不过要判断i=k&&j=l的情况。

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    struct point{
        int x,y,data;
    }p[100];
    
    int n,m,map[11][11],f[11][11][11][11];
    
    int main(){
        int i,j,k,l;
        scanf("%d",&n);
        while(1){
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            if(!a&&!b&&!c)
                break;
            p[++m].x=a;
            p[m].y=b;
            p[m].data=c;
        }
        for(i=1;i<=m;i++){
            map[p[i].x][p[i].y]=p[i].data;
        }
        for(i=1;i<=n;i++){
            for(j=1;j<=n;j++){
                for(k=1;k<=n;k++){
                    l=i+j-k;
                    if(l<=0)
                        break;
                    f[i][j][k][l]=max(f[i-1][j][k-1][l],max(f[i-1][j][k][l-1],max(f[i][j-1][k-1][l],f[i][j-1][k][l-1])));
                    if(i==k&&j==l){ 
                        f[i][j][k][l]+=map[i][j];
                    }
                    else{
                        f[i][j][k][l]+=map[i][j]+map[k][l];
                    }
                }
            }
        }
        printf("%d
    ",f[n][n][n][n]);
        return 0;
    }
  • 相关阅读:
    78. Subsets
    93. Restore IP Addresses
    71. Simplify Path
    82. Remove Duplicates from Sorted List II
    95. Unique Binary Search Trees II
    96. Unique Binary Search Trees
    312. Burst Balloons
    程序员社交平台
    APP Store开发指南
    iOS框架搭建(MVC,自定义TabBar)--微博搭建为例
  • 原文地址:https://www.cnblogs.com/hrj1/p/11184274.html
Copyright © 2011-2022 走看看