zoukankan      html  css  js  c++  java
  • Codeforces Round #208 (Div. 2) D. Dima and Hares DP

    链接:

    http://codeforces.com/contest/358/problem/D

    题意:

    给出n个数,每个数取走的贡献与相邻的数有关,如果取这个数的时候,左右的数都还没被取,那么权值为a,如果左右两个数有一个被取走了,那么权值为b,如果左右两个数都被取走了,那么权值为c,求取取走全部数的最大值。

    题解:

    定义状态: 

    dp[i][1][0]表示选第i时,相邻的数有一个被取走,这个数在当前数左侧。

    dp[i][1][1]表示选第i时,相邻的数有一个被取走,这个数在当前数右侧。

    dp[i][2][0]表示选第i时,相邻的数都被取走了

    dp[i][0][0]表示选第i时,相邻的数都没被取走 

    代码:

    31 int n;
    32 int a[MAXN], b[MAXN], c[MAXN];
    33 int dp[MAXN][3][2];
    34 
    35 int main() {
    36     ios::sync_with_stdio(false), cin.tie(0);
    37     cin >> n;
    38     rep(i, 0, n) cin >> a[i];
    39     rep(i, 0, n) cin >> b[i];
    40     rep(i, 0, n) cin >> c[i];
    41     memset(dp, 0, sizeof(dp));
    42     dp[0][0][0] = a[0];
    43     dp[0][1][1] = b[0];
    44     dp[0][1][0] = dp[0][2][0] = -INF;
    45     rep(i, 1, n) {
    46         dp[i][0][0] = max(dp[i - 1][1][1], dp[i - 1][2][0]) + a[i];
    47         dp[i][1][0] = max(dp[i - 1][1][0], dp[i - 1][0][0]) + b[i];
    48         dp[i][1][1] = max(dp[i - 1][1][1], dp[i - 1][2][0]) + b[i];
    49         dp[i][2][0] = max(dp[i - 1][1][0], dp[i - 1][0][0]) + c[i];
    50     }
    51     cout << max(dp[n - 1][0][0], dp[n - 1][1][0]) << endl;
    52     return 0;
    53 }
  • 相关阅读:
    strpbrk函数
    memchr函数
    memset函数
    strrev函数
    strncmp函数
    strset函数
    strtok函数
    计算机经典书籍之程序设计语言
    spring自定义bean的作用域
    lucene文章
  • 原文地址:https://www.cnblogs.com/baocong/p/7327681.html
Copyright © 2011-2022 走看看