zoukankan      html  css  js  c++  java
  • nyoj 234 吃土豆

    描述

    Bean-eating is an interesting game, everyone owns an M*N matrix, which is filled with different qualities beans. Meantime, there is only one bean in any 1*1 grid. Now you want to eat the beans and collect the qualities, but everyone must obey by the following rules: if you eat the bean at the coordinate(x, y), you can’t eat the beans anyway at the coordinates listed (if exiting): (x, y-1), (x, y+1), and the both rows whose abscissas are x-1 and x+1.



    Now, how much qualities can you eat and then get ?
     
    输入
    There are a few cases. In each case, there are two integer M (row number) and N (column number). The next M lines each contain N integers, representing the qualities of the beans. We can make sure that the quality of bean isn't beyond 1000, and 1<=M,N<=500.
    输出
    For each case, you just output the MAX qualities you can eat and then get.
    样例输入
    4 6
    11 0 7 5 13 9
    78 4 81 6 22 4
    1 40 9 34 16 10
    11 22 0 33 39 6
    样例输出
    242

    思路:

    考虑对于某行某列元素,row[i][j]表示加上位置为i,j的土豆的质量的i行j列最大的和

    列的最大值:row[i][j]=max(row[i][j-2]+row[i][j-3])+val

    看图说话:

    假设红色的格子为i行j列,那么它的前面有两种选择方案:

    1、选择蓝色格子

    2、选择黄色格子

    那么该行最大的和是什么呢?

    由于n列、n-1列具有状态无关性(n-1列的状态影响不了n列的状态),很显然等于max(row[i][n],row[i][n-1])

    同理对于dp[i] (i行的最大值)

    dp[i]=max(dp[i-2],dp[i-3])+max_row[i]

    看图说话:

    max土豆质量=max(dp[m],dp[m-1])

    为了方便计算,我的代码把n,m扩大了2

    AC代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 #define N 506
     6 int n,m;
     7 int col[N][N];
     8 int dp[N];
     9 int main()
    10 {
    11     while(scanf("%d%d",&n,&m)==2){
    12         memset(col,0,sizeof(col));
    13         memset(dp,0,sizeof(dp));
    14         for(int i=3;i<n+3;i++){
    15            for(int j=3;j<m+3;j++){
    16                int x;
    17                scanf("%d",&x);
    18                col[i][j] = max(col[i][j-2],col[i][j-3])+x;
    19            }
    20         }
    21         for(int i=3;i<n+3;i++){
    22             dp[i]=max(dp[i-2],dp[i-3])+max(col[i][m+1],col[i][m+2]);
    23         }
    24         printf("%d
    ",max(dp[n+1],dp[n+2]));
    25     }
    26     return 0;
    27 }
  • 相关阅读:
    jsp mysql 配置线程池
    服务端 模拟 检测 攻击。。乱写
    硕思闪客精灵 7.2 破解版
    unity UnityAwe 插件
    smartfoxserver 2x 解决 Math NAN
    unity 断点下载
    java 监听文件目录修改
    wind7 64 setup appjs
    sfs2x 修改jvm 内存
    unity ngui 解决图层问题
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/5491145.html
Copyright © 2011-2022 走看看