【文章標題打着轉載,是因爲不是自己想出來的解題,但下面的文字是自己敲的【~捂臉*>_<*~】】
題目就不貼了~~~DP+greedy的題。弱爆了看別人的代碼思路過的。T^T但還是自己複述一遍吧~~
剛開始看題目有點下不了手,不知道該怎麼喂傲嬌的小兔紙纔好。
然後看了解題才知道,哦,原來是醬紫:就是喂某隻小兔紙,可是收穫的那隻兔紙快樂值跟周圍的兔紙有木有餵飽有關~~然後全部兔紙都要喂。
dp轉移方程如下:
dp[i][0] = max(d[i-1][0] + b[i-1],d[i-1][1] + c[i-1]); //d[i][0] 代表i-1只兔子沒被餵過 所以前者的喂兔紙的順序是:i-> i-1 -> i-2;後者喂兔紙的順序是:i-2 -> i -> i-1
dp[i][1] = max(d[i-1][0] + a[i-1],d[i-1][1] + b[i-1]). //d[i][1] 代表i-1只兔子被餵過 所以前者的喂兔紙的順序是:i-1 -> i -> i-2;後者喂兔紙的順序是:i-2 -> i-1 -> i
藍後代碼如下了~~
#include<iostream>
using namespace std;
const int Max = 3005;
int dp[Max][2];
int max(int &a, int &b)
{
return a > b?a:b;
}
int main()
{
int n;
cin>>n;
int a[Max],b[Max],c[Max];
for(int i = 1; i <= n; i++)
cin>>a[i];
for(int i = 1; i <= n; i++)
cin>>b[i];
for(int i = 1; i <= n; i++)
cin>>c[i];
for(int i = 0; i < Max; i++)
for(int j = 0; j < 2; j++)
dp[i][j] = 0;
if(n == 1) {cout<<a[1]<<endl; return 0;}
//dp[i][0]表示i-1沒取過,dp[i][1]表示i-1取過
dp[2][0] = b[1];
dp[2][1] = a[1];
for(int i = 3; i <= n; i++)
{
dp[i][0] = max(dp[i-1][0]+b[i-1],dp[i-1][1]+c[i-1]);
dp[i][1] = max(dp[i-1][0]+a[i-1],dp[i-1][1]+b[i-1]);
}
int as;
as = max(dp[n][0]+a[n],dp[n][1]+b[n]);
cout<<as<<endl;
return 0;
}