标签:
Description
Input
Output
Sample Input
Sample Output
#include<iostream> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #include<algorithm> using namespace std; #define N 1000 #define oo 0x3f3f3f3f int main() { int n, a[N], sum[N]; while(scanf("%d", &n), n) { int i, j; memset(a, 0, sizeof(a)); memset(sum, 0, sizeof(sum)); for(i=1; i<=n; i++) scanf("%d", &a[i]); /** 我决定了要好好学 dp 这次写自然是要自己感悟的,自己想真的不容易, 尽管写过,尽管很简单,我也只是无奈,不好想 我又开了个数组 sum[], 里面记录的是从 1 开始到 i 最大的上升序列的和 既然 sum[i] 里记录的是最大的从 1 到 i 的值,那么每次比较 a[i] 和 a[j] 的大小 如果 a[i] 比 a[j] 大的话,就需要选 sum[i] 和 sum[j]+a[i] 的最大值 最后在 sum 中选个最大值就 OK 啦!!! **/ for(i=1; i<=n; i++) { sum[i] = a[i]; for(j=1; j<=i; j++) { if(a[i]>a[j]) sum[i] = max(sum[i], a[i]+sum[j]); } } int Max = -oo; for(i=1; i<=n; i++) Max = max(Max, sum[i]); printf("%d\n", Max); } return 0; }
(最大上升子序列) Super Jumping! Jumping! Jumping! -- hdu -- 1087
标签:
原文地址:http://www.cnblogs.com/YY56/p/4861559.html