题意:有n只兔子需要喂养,每只兔子被喂养后的幸福感取决于与它相邻的兔子中已经被喂养的数量。现在问喂养这n只兔子可以获得的总幸福感最多是多少?

思路:初步分析题目发现,一只兔子被喂养获得的幸福感取决于其它兔子的喂养情况,所有首先想到状压DP。但是n到3000, 所以不行。我们发现兔子获得的幸福感只取决于与它相邻的兔子的幸福感。更准确的说,取决于与它相邻的兔子和它自己被喂养的先后顺序,所以,我们只要表示出与它相邻的兔子和它的喂养先后顺序就解决问题了。设dp[i][0]为已经喂养的前i只兔子,并且第i只兔子比第i + 1只兔子先喂养。dp[i][1]是后喂养,因为我们枚举i状态来更新i + 1状态。因为我们知道了喂养顺序,所以就知道了第i只兔子获得的幸福感。

代码:

#include <bits/stdc++.h>
#define LL long long
#define INF 0x3f3f3f3f
#define pii pair<int, int>
#define db double
using namespace std;
const int maxn = 3010;
int val[3][maxn], f[maxn][2];
int main() {
int n;
scanf("%d", &n);
for (int j = 0; j < 3; j++) {
for (int i = 1; i <= n; i++) {
scanf("%d", &val[j][i]);
}
}
f[1][0] = val[0][1];
f[1][1] = val[1][1];
for (int i = 1; i < n - 1; i++) {
f[i + 1][0] = max(f[i][0] + val[1][i + 1], f[i][1] + val[0][i + 1]);
f[i + 1][1] = max(f[i][0] + val[2][i + 1], f[i][1] + val[1][i + 1]);
}
if(n > 1)
f[n][0] = max(f[n - 1][0] + val[1][n], f[n - 1][1] + val[0][n]);
// f[n][1] = max(f[n - 1][0] + val[1][n], f[n - 1][1] + val[0][n]);
printf("%d\n", f[n][0]);
}

  

Codeforces 358D DP的更多相关文章

  1. Codeforces 358D Dima and Hares:dp【只考虑相邻元素】

    题目链接:http://codeforces.com/problemset/problem/358/D 题意: 有n个物品A[i]摆成一排,你要按照某一个顺序将它们全部取走. 其中,取走A[i]的收益 ...

  2. Codeforces 358D【DP】

    思路:  dp[i][0] 代表取的时候左边没有 dp[i][1] 代表取的时候右边没有 dp[i][2] 代表取的时候左右都没有 dp[i][3] 代表取的时候左右都有 然后自己转移吧= =. 注意 ...

  3. Two Melodies CodeForces - 813D (DP,技巧)

    https://codeforces.com/problemset/problem/813/D dp[i][j] = 一条链以i结尾, 另一条链以j结尾的最大值 关键要保证转移时两条链不能相交 #in ...

  4. Consecutive Subsequence CodeForces - 977F(dp)

    Consecutive Subsequence CodeForces - 977F 题目大意:输出一序列中的最大的连续数列的长度和与其对应的下标(连续是指 7 8 9这样的数列) 解题思路: 状态:把 ...

  5. codeforces的dp专题

    1.(467C)http://codeforces.com/problemset/problem/467/C 题意:有一个长为n的序列,选取k个长度为m的子序列(子序列中不能有位置重复),求所取的k个 ...

  6. Codeforces 721C [dp][拓扑排序]

    /* 题意:给你一个有向无环图.给一个限定t. 问从1点到n点,在不超过t的情况下,最多可以拜访几个点. 保证至少有一条路时限不超过t. 思路: 1.由无后向性我们可以知道(取决于该图是一个DAG), ...

  7. CodeForces 607C (DP) Hard problem

    题目:这里 题意:给定n个字符串,每个字符串可以进行一项操作,就是将这个字符串交换,就是该字符串的第一个和最后一个交换,第二个和倒数第二个交换,以此类推,当然可以选择对于 该字符串进行或不进行这项操作 ...

  8. Codeforces 611d [DP][字符串]

    /* 题意:给一个长度不超过5000的字符串,每个字符都是0到9的数字. 要求将整个字符串划分成严格递增的几个数字,并且不允许前导零. 思路: 1.很开心得发现,当我在前i个区间以后再加一个区间的时候 ...

  9. Codeforces 404D [DP]

    /* 我是一个习惯后悔,但是没办法忍受内疚感的二货== 这题是个无脑dp,但是比赛大概20min没出...其实最后5min我好好想想简单化边界条件,可以出的. 题意: 给你一个长度为1e6的由?*01 ...

随机推荐

  1. Vue-系统修饰键

    可以用如下修饰符来实现仅在按下相应按键时才触发鼠标或键盘事件的监听器. .ctrl .alt .shift .meta 例如: 例如: <!-- Alt + C --> <input ...

  2. condition简单示例

    在concurrent包中提供了condition接口,通过该接口可唤醒指定的某个线程,而不是采用随机唤醒的形式. import java.util.concurrent.locks.Conditio ...

  3. 为什么要用unittest

    '''为什么要使用单元测试框架?: 1.当用例很多的时候用来组织用例和执行用例 2.提供丰富的比较方法 3.提供丰富的日志''' import unittest import HTMLTestRunn ...

  4. BZOJ2280 [Poi2011]Plot 二分+倍增+最小圆覆盖

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2280 https://loj.ac/problem/2159 题解 显然对于一段的 \(q_i ...

  5. 随手记--QT

    设置toolButton按钮隐藏(可视化): ui->toolButton->setVisible(true); 改变按钮背景色: ui->toolButton->setSty ...

  6. linux的块设备层

    ll_rw_block()是块设备驱动层,向上提供按block读写块设备到某个内存地址的(是以page为目标单位)方法. bread()是块设备缓冲层,磁盘上的block用页缓存.先从这个缓存里找,找 ...

  7. 【8.0.0_r4】AMS分析(十六)(ActivityManagerService.java上)

    代码位于frameworks/base/services/core/java/com/android/server/am/,一共有七十个文件. Java源码位于package com.android. ...

  8. Stream学习笔记

    1. 创建Stream实例的五种方式 @Test public void test1(){ // 创建Stream对象的第一种方式 List<String> list = Lists.ne ...

  9. PHP数据如何向上取整

    PHP数据如何向上取整? PHP数据向上取整可以通过ceil()函数来实现,ceil()函数表示向上舍入为最接近的整数. 语法是: 1 ceil(x) 参数 x 必需.一个数. 说明 返回不小于 x ...

  10. EDA课设-交通灯-Verilog版----FPGA--004

    分得到析四个状态: S1: 主干道(绿灯亮) ,支干道(亮红灯):--40S S1: 主干道 (黄灯亮) ,支干道(亮红灯):--4S S1: 主干道 (亮红灯),支干道(绿灯亮):--20S S1: ...