zoukankan      html  css  js  c++  java
  • HDU

    http://acm.hdu.edu.cn/showproblem.php?pid=2845

    审题 

    取一个点 那么相邻行的点和 这一行和它左右相连的点就不能再取了

    涉及取舍的问题 整体无法考虑 只能从局部出发-->>动态规划

    可惜没看出来 ----要进行状态压缩 就是很标准的dp了 

    1、先多每一行进dp求得每一行可以得到的最大值

    2、在取对n行进行dp得到最终的最大值

    所以两类其实方式都是一样的

    以求每一行最大值为例 culumn[MAXN];

    定义dp[i] : 前i列(含)可以取 得的最大值

    转移方程dp[i] = max(dp[i-2] + culumn[i], dp[i-1]) 

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <string.h>
     4 
     5 
     6 using namespace std;
     7 
     8 
     9 int N, M;
    10 long long culumn[200004];
    11 long long row[200004];
    12 long long dp[200004];
    13 int main()
    14 {
    15     freopen("in.txt" ,"r", stdin);
    16     while(~scanf("%d%d" ,&N, &M))
    17     {
    18         memset(dp, 0, sizeof(dp));
    19         memset(row, 0, sizeof(row));
    20         for (int i = 0; i < N; i++)
    21         {
    22             for (int j = 0; j < M; j++)
    23             {
    24                 long long tmp = 0;
    25                 scanf("%lld", &tmp);
    26                 if (j == 0) row[j] = tmp;
    27                 else if (j == 1) row[j] = max(tmp, row[j-1]);
    28                 else row[j] = max(row[j-2]+tmp, row[j-1]);
    29             }
    30             culumn[i] = row[M-1];
    31         }
    32         dp[0] = culumn[0];
    33         dp[1] = max(dp[0], culumn[1]);
    34         for (int i = 2; i < N; i++)
    35         {
    36             dp[i] = max(culumn[i]+dp[i-2], dp[i-1]);
    37         }
    38         printf("%lld
    ", dp[N-1]);
    39     }
    40     return 0;
    41 }
  • 相关阅读:
    poj 3243 Clever Y(BabyStep GiantStep)
    poj 2417 Discrete Logging
    poj 3481 Double Queue
    hdu 4046 Panda
    hdu 2896 病毒侵袭
    poj 1442 Black Box
    hdu 2815 Mod Tree
    hdu 3065 病毒侵袭持续中
    hdu 1576 A/B
    所有控件
  • 原文地址:https://www.cnblogs.com/oscar-cnblogs/p/6390275.html
Copyright © 2011-2022 走看看