题意,给出一列数,要求所有上升子序列中序列和最大的。
这回不是求长度了,但是还是相当基础的 dp 水题,只要用 dp [ q ] 记录以 第 q 个数 a [ q ] 为结尾的上升子序列的最大的和就可以了
对于 q ,初始化 dp [ q ] = a [ q ] ,从最前面到 q 遍历,若有第 i 个数 a [ i ] < a [ q ] ,则 dp [ q ] = max ( dp [ q ] , dp [ i ] + a [ q ] );
这样 dp 一遍并同时记录下最大值,就可以直接输出结果了
1 #include2 #include 3 #define max(a,b) a>b?a:b 4 5 int a[1002]; 6 long long dp[1002]; 7 8 int main(){ 9 int n;10 while(scanf("%d",&n)!=EOF&&n!=0){11 int q,i,j;12 long long m=0;13 for(q=1;q<=n;q++){14 scanf("%d",&a[q]);15 dp[q]=a[q];16 for(i=1;i