题目链接:
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1270
题解:
题目本身不难,但是题目的大意自己读了很久才理解。
题目就是让你自己创建大小为n的数组,其中里面元素的值的范围为[1,b[i]]注意这里是闭区间,问你,求你自己构建的a数组的最大代价是多少。
思路其实很简单,首先我们可以直接用贪心的思想去考虑,a[i]的元素只肯能是1或则是b[i]。下面的话,就是一个比较简单的dp,直接看代码。
代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define met(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
const int maxn = 5e4+10;
int num[maxn];
int dp[maxn][2];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
met(dp,0);
for(int i=2;i<=n;i++)
{
dp[i][0]=max(dp[i-1][1]+abs(num[i-1]-1),dp[i-1][0]);
// dp[i][0]表示这个数字是1,所以,它的最大值就是前者减去1,或则是它本身。
dp[i][1]=max(dp[i-1][0]+abs(num[i]-1),dp[i-1][1]+abs(num[i]-num[i-1]));
// dp[i][1]表示这个数字是有他的本身所构成的。
}
printf("%d\n",max(dp[n][0],dp[n][1]));
}
}