题目1550:分糖果
时间限制:1 秒
内存限制:128 兆
特殊判题:否
提交:1092
解决:266
-
题目描述:
-
给从左至右排好队的小朋友们分糖果,
要求:
1.每个小朋友都有一个得分,任意两个相邻的小朋友,得分较高的所得的糖果必须大于得分较低的,相等则不作要求。
2.每个小朋友至少获得一个糖果。
求,至少需要的糖果数。
-
输入:
-
输入包含多组测试数据,每组测试数据由一个整数n(1<=n<=100000)开头,接下去一行包含n个整数,代表每个小朋友的分数Si(1<=Si<=10000)。
-
输出:
-
对于每组测试数据,输出一个整数,代表至少需要的糖果数。
-
样例输入:
-
3 1 10 1 3 6 2 3 2 1 1
-
样例输出:
-
4 5 2
-
来源:
- 2014年王道论坛研究生机试练习赛(二)
-
- 思路:记忆化搜索
- c++代码:
-
//1550 分糖果 #include<cstdio> #include<memory.h> #include<algorithm> using namespace std; const int MAX = 100001; int res(int p,int n,int arr[],int dp[]) { if(dp[p]>0) return dp[p]; dp[p] = 1; if(p<=n-1 && arr[p]>arr[p+1]) dp[p] = max(dp[p], res(p+1,n,arr,dp)+1); if(p>=2 && arr[p]>arr[p-1]) dp[p] = max(dp[p], res(p-1,n,arr,dp)+1); return dp[p]; } int main(void) { int dp[MAX]; int arr[MAX]; int n; while(~scanf("%d", &n)) { memset(dp,0,sizeof(dp)); for(int i=1; i<=n; ++i) scanf("%d", &arr[i]); long long sum=0; for(int i=1; i<=n; ++i) { sum += res(i,n,arr,dp); } printf("%lld\n",sum); } return 0; }