HDU 2713 DP

xiaoxiao2021-02-28  55

题意:有n种药,对于当前的药可以选择 吃 或者 不吃 ,吃的话,当前药如果是吃的第奇数个药就+这个药力,如果是第偶数个那就-这个药力。

思路:对于当前i只面临两种状态,一种是当前i是偶数个,一种是当前i是奇数个。如果是偶数,那么在(第i-1个面临奇数个时的最大药力+当前药力)或(第i-1面临偶数个)可以理解成取或者不取。奇数也是这样的。

重点说一下 为什么

dp[i][0]=max(dp[i-1][1]-temp,dp[i-1][0]);

后面是dp[i-1][0],就是相当于没拿,然后i-1次面临偶数次选择能完成的,i次也一定能完成。

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=150005; int main(){ int n,temp,dp[maxn][2]; while(~scanf("%d",&n)){ memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ scanf("%d",&temp); dp[i][0]=max(dp[i-1][1]-temp,dp[i-1][0]);//偶数个 dp[i][1]=max(dp[i-1][0]+temp,dp[i-1][1]); } printf("%d\n",max(dp[n][0],dp[n][1])); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-46387.html

最新回复(0)