• 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 }
  • 相关阅读:
    帆软报表实现全选全不选的功能
    knowledge_others
    skills_kafka
    skills_operation
    problems_others
    skills_windows
    c语言标识符
    快速排序法
    字符串处理scanf("%d%*c",&n);
    Byte.parseByte(String s,int radix)的解释
  • 原文地址:https://www.cnblogs.com/oscar-cnblogs/p/6390275.html
Copyright © 2020-2023  润新知