1003-C专题三

来源:互联网 发布:人员优化方案 编辑:程序博客网 时间:2024/05/21 02:33

1.题号:1003-C

2.题意:其实就是最大递增子段和
3 1 3 2 1+3=4
4 1 2 3 4 1+2+3+4=10
4 3 3 2 1  3=3

3.思路:状态方程:sum[j]=max{sum[i]}+a[j]; 其中,0<=i<=j,a[i]<a[j] ,
      dp[i]表示以i节点为终点,获得总分最大的值 。

4.感想:这道题跟一道给出一串数字,求和最大的子序列的题很相似,只不过那道题是求和,这道题试求递增的,想法很相似。

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int a[1005],dp[1005];const int inf = 999999999;int main(){    int n,i,t,m,j,ans;    while(~scanf("%d",&n),n)    {        memset(dp,0,sizeof(dp));        for(i = 1;i<=n;i++)        scanf("%d",&a[i]);        for(i = 1;i<=n;i++)        {            ans = -inf;            for(j = 0;j<i;j++)            {                if(a[i]>a[j])                ans = max(ans,dp[j]);            }            dp[i] = ans+a[i];        }        ans = -inf;        for(i = 0;i<=n;i++)        {            if(dp[i]>ans)            ans = dp[i];        }        printf("%d\n",ans);    }    return 0;}


0 0