首页 > 代码库 > codeforces 484D Kindergarten (dp、贪心)
codeforces 484D Kindergarten (dp、贪心)
题意:给n个数,分成若干个连续组,每组获益为max-min,输出最大获益。
参考:http://blog.csdn.net/keshuai19940722/article/details/40873581
参考的链接里说得很明白了,我的dp[i][0]是升序,dp[i][1]是降序,习惯而已。
这题关键点就是,如果a[i-1]<a[i]>a[i+1],显然3个分开(a[i]归左或右)不比在一起差。
#include <cstdio>#include <cstring>#include <iostream>#include <cmath>#include <algorithm>#include <vector>#include <string>#include <set>#include <queue>#include <map>#include <ctime>using namespace std;#define ll long long#define MP make_pair#define inf 1e9#define eps 1e-8#define maxn 1010000int a[maxn];ll dp[maxn][2];int main(){ int n; while(~scanf("%d",&n)){ for(int i=0;i<n;++i) scanf("%d",a+i); dp[0][0]=dp[0][1]=0; for(int i=1;i<n;++i){ if(a[i-1]<a[i]){ dp[i][0] = max(dp[i-1][0]+a[i]-a[i-1], dp[i-1][1]); dp[i][1] = max(dp[i-1][0], dp[i-1][1]); }else { dp[i][0] = max(dp[i-1][0], dp[i-1][1]); dp[i][1] = max(dp[i-1][1]+a[i-1]-a[i], dp[i-1][0]); } } printf("%I64d\n", max(dp[n-1][0], dp[n-1][1])); } return 0;}
codeforces 484D Kindergarten (dp、贪心)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。