宵暗的妖怪
题意:
给定一数组: 获得的饱食度最大值是多少? 从数组中选取一个s[i] 那么他的左右都会被暗黑吞噬,意味着
不能被选取了。且i能选择首尾(选择了有一部分就不能吞噬了呢)。
思路:动态规划,
s数组表示每个值。
用a数组,表示前i个的饱食度最大值。
dp三步走:
1.无后效性,嗯。。
2.赋初值
3.后面结果需要用到前面的结果
a[i]=max(a[i-1],a[i-3]+s[i-1]);
比较两个数 前一个饱食度的值,和需要添加的饱食度+暗黑吞噬值。
代码如下:
#include<iostream>
using namespace std;
#define ll long long
ll n;
ll s[100010];
ll a[100010];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>s[i];
}
//赋初值
a[1]=a[2]=0;
a[3]=s[2];
int ans=0;
for(int i=4;i<=n;i++){
//得结果
a[i]=max(a[i-1],a[i-3]+s[i-1]);
//a[i]=max(a[i],a[i-1]);
}
//for(int i=1;i<=n;i++){cout<<a[i]<<" "; }
cout<<a[n]<<endl;
return 0;
}