题意,给出一列数,要求所有上升子序列中序列和最大的。
这回不是求长度了,但是还是相当基础的 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 #include<stdio.h> 2 #include<string.h> 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<q;i++){ 17 if(a[i]<a[q]){ 18 dp[q]=max(dp[q],dp[i]+a[q]); 19 } 20 } 21 m=max(m,dp[q]); 22 } 23 printf("%I64d\n",m); 24 } 25 return 0; 26 }
时间: 2024-10-11 07:44:11