Super Jumping! Jumping! Jumping!
搬中文ing
Descriptions:
wsw成功的在zzq的帮助下获得了与小姐姐约会的机会,同时也不用担心wls会发现了,可是如何选择和哪些小姐姐约会呢?wsw希望自己可以循序渐进,同时希望挑战自己的极限,我们假定每个小姐姐有一个“攻略难度值” 从攻略成功第一个小姐姐开始,wsw希望每下一个需要攻略的小姐姐难度更高,同时又希望攻略难度值之和最大,好了,现在小姐姐们排成一排,wsw只能从左往右开始攻略,请你帮助他找到最大的攻略难度和
Input
多组输入,每组数据占一行,每行一个整数n表示小姐姐个数,接着n个数a_1, a_2, ..., a_n表示第i个的小姐姐攻略难度 (a_i在32位有符号整型范围内),n = 0表示输入结束 (0 <= n <= 1000)。
Output
一个数,最大攻略和
Sample Input
3 1 3 2 4 1 2 3 4 4 3 3 2 1 0
Sample Output
4 10 3
题目链接
https://vjudge.net/problem/HDU-1087
求解最大递增子序列和 不要求是连续的最大递增子序列。但是一定要注意是递增的
dp[i]表示的是前i个并且包含第i个的最大递增子序列和
若a[i]>a[j] dp[i]=dp[j]+a[i]
开两个for循环全部遍历一遍即可
AC代码
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #define Mod 1000000007 #define eps 1e-6 #define ll long long #define INF 0x3f3f3f3f #define MEM(x, y) memset(x, y, sizeof(x)) #define Maxn 1000+10 using namespace std; int n; int dp[Maxn]; int a[Maxn]; int main() { while(cin>>n&&n!=0) { MEM(dp,0);//初始化 MEM(a,0); for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<n;i++) { for(int j=0;j<=i;j++) { if(a[i]>a[j]) dp[i]=max(dp[i],dp[j]+a[i]); } dp[i]=max(dp[i],a[i]); } sort(dp,dp+n); cout<<dp[n-1]<<endl; } return 0; }