CodeForces

来源:互联网 发布:mac虚拟机连校园网 编辑:程序博客网 时间:2024/06/06 17:29

D. Dima and Hares

time limit per test2 seconds
memory limit per test256 megabytes

Dima liked the present he got from Inna very much. He liked the present he got from Seryozha even more.

Dima felt so grateful to Inna about the present that he decided to buy her n hares. Inna was very happy. She lined up the hares in a row, numbered them from 1 to n from left to right and started feeding them with carrots. Inna was determined to feed each hare exactly once. But in what order should she feed them?

Inna noticed that each hare radiates joy when she feeds it. And the joy of the specific hare depends on whether Inna fed its adjacent hares before feeding it. Inna knows how much joy a hare radiates if it eats when either both of his adjacent hares are hungry, or one of the adjacent hares is full (that is, has been fed), or both of the adjacent hares are full. Please note that hares number 1 and n don’t have a left and a right-adjacent hare correspondingly, so they can never have two full adjacent hares.

Help Inna maximize the total joy the hares radiate. :)

Input
The first line of the input contains integer n (1 ≤ n ≤ 3000) — the number of hares. Then three lines follow, each line has n integers. The first line contains integers a1 a2 … an. The second line contains b1, b2, …, bn. The third line contains c1, c2, …, cn. The following limits are fulfilled: 0 ≤ ai, bi, ci ≤ 105.

Number ai in the first line shows the joy that hare number i gets if his adjacent hares are both hungry. Number bi in the second line shows the joy that hare number i radiates if he has exactly one full adjacent hare. Number сi in the third line shows the joy that hare number i radiates if both his adjacent hares are full.

Output
In a single line, print the maximum possible total joy of the hares Inna can get by feeding them.

Examples
input
4
1 2 3 4
4 3 2 1
0 1 1 0
output
13
input
7
8 5 7 6 1 8 9
2 7 9 5 4 3 1
2 3 3 4 1 1 3
output
44
input
3
1 1 1
1 2 1
1 1 1
output
4


题意:

有一排兔子,将其喂饱后会获得相应的满足感。如果两边的兔子都是饿的,那么获得a[i]的满足感;如果两边有一个兔子喂饱了,那么获得b[i]的满足感;如果两边的兔子都是饱的,那么获得c[i]的满足感。求获得的最大的满足感。

题解:

定义dp:

  • dp[i][0]表示先喂i-1,再喂i。
  • dp[i][1]表示先喂i,再喂i-1。

所以遍历到i的时候,i-1的满足感是已知的。即dp[i]获得i-1的满足感。由于第i个兔子有两个状态,所以都要存起来。

转移方程:

  • dp[i][0]=max(dp[i-1][0]+b[i-1],dp[i-1][1]+a[i-1]);
  • dp[i][1]=max(dp[i-1][0]+c[i-1],dp[i-1][1]+b[i-1]);

需要遍历到dp[n][0],因为最后一个兔子的后面是不可能喂到的。


代码

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define MAXN 3005#define inf 1<<29int n,a[MAXN],b[MAXN],c[MAXN],dp[MAXN][2];//dp[i][0]表示先喂i-1,dp[i][1]表示先喂iint main(){    while(~scanf("%d",&n))    {        for(int i=0;i<n;i++)            scanf("%d",&a[i]);        for(int i=0;i<n;i++)            scanf("%d",&b[i]);        for(int i=0;i<n;i++)            scanf("%d",&c[i]);        dp[0][0]=-inf;        dp[n][1]=0;        for(int i=1;i<=n;i++)        {            dp[i][0]=max(dp[i-1][0]+b[i-1],dp[i-1][1]+a[i-1]);            dp[i][1]=max(dp[i-1][0]+c[i-1],dp[i-1][1]+b[i-1]);        }        printf("%d\n",dp[n][0]);    }    return 0;}
原创粉丝点击