JD 1550:分糖果(线性dp + 记忆化搜索)

来源:互联网 发布:我国近年财政补贴数据 编辑:程序博客网 时间:2024/06/06 08:50
题目描述:

给从左至右排好队的小朋友们分糖果,
要求:
1.每个小朋友都有一个得分,任意两个相邻的小朋友,得分较高的所得的糖果必须大于得分较低的,相等则不作要求。
2.每个小朋友至少获得一个糖果。
求,至少需要的糖果数。

输入:

输入包含多组测试数据,每组测试数据由一个整数n(1<=n<=100000)开头,接下去一行包含n个整数,代表每个小朋友的分数Si(1<=Si<=10000)。

输出:

对于每组测试数据,输出一个整数,代表至少需要的糖果数。

样例输入:
31 10 136 2 321 1
样例输出:
452
代码:
#include <iostream>#include <string>#include <string.h>#include <map>#include <stdio.h>#include <algorithm>#include <queue>#include <vector>#include <math.h>#include <set>#define Max(a,b) ((a)>(b)?(a):(b))#define Min(a,b) ((a)<(b)?(a):(b))#define SWAP(a , b){ int temp = a; a = b; b = temp;}#define Max_N 1000008using namespace std;int x[Max_N];int honey[Max_N];int n;int dp(int i)//记忆化搜索{    if(honey[i] > -1) return honey[i];    honey[i] = 1;    if(i + 1 <= n&&x[i] > x[i + 1])         honey[i] = Max(honey[i] , dp(i + 1) + 1);    if(i - 1 >= 1&&x[i - 1] < x[i])         honey[i] = Max(honey[i] , dp(i - 1) + 1);    return honey[i];}int solve(){    int sum = 0;    for(int i = 1;i <= n;i++)        sum += dp(i);    return sum;}int main(){    while(cin >> n)    {        memset(honey,-1,sizeof(honey));        for(int i = 1;i <= n;i++)            cin >> x[i];        cout << solve() << endl;    }    return 0;}


0 0