HDU - 1087 Super Jumping! Jumping! Jumping!
题意:
n个数中,选出升序的序列,使得和最大
分析:
第i个数为结尾的时候,前面比他小的数都能加上,选择和最大的,最优化原理
状态dp[i]:表示以i结尾时的最大和
转移方程:
dp[i] = max(dp[i], dp[j]+1);
核心:
for(i = 1; i<=n; i++) { dp[i] = v[i]; for(j = 1; j<i; j++) { if(a[i] > a[j]) dp[i] = max(dp[i], dp[j] + v[i]); } }
代码:
#include <stdio.h> #include <iostream> #include <string.h> #include <string> #include <math.h> #include <algorithm> #include <queue> #include <stack> #include <map> #include <vector> #include <time.h> using namespace std; int v[100+10]; int dp[100+10]; int main() { //freopen("a.txt", "r", stdin); int n, i, j, ans; while(~scanf("%d", &n) && n) { for(i = 1; i<=n; i++) { scanf("%d", &v[i]); } ans = 0; memset(dp, 0, sizeof(dp)); for(i = 1; i<=n; i++) { dp[i] = v[i]; for(j = i-1; j>=1; j--) { if(v[i] > v[j]) dp[i] = max(dp[i], dp[j] + v[i]); } ans = max(ans, dp[i]); } printf("%d\n", ans); } return 0; }