hdu1087 最大递增子段和

http://acm.split.hdu.edu.cn/showproblem.php?pid=1087

状态方程:sum[j]=max{sum[i]}+a[j]; 其中,0<=i<=j,a[i]<a[j]

把当前最大和更新到数组中,注意顺序。

Input

Input contains multiple test cases. Each test case is described in a line as follow:
N value_1 value_2 …value_N 
It is guarantied that N is not more than 1000 and all value_i are in the range of 32-int.
A test case starting with 0 terminates the input and this test case is not to be processed.

Output

For each case, print the maximum according to rules, and one line one case.

Sample Input

3 1 3 2

4 1 2 3 4

4 3 3 2 1

0

Sample Output

4

10

3

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define INF 0xfffffff

int a[1005];
int dp[1005];

int main()
{
    int n;
    while(scanf("%d",&n)==1 && n)
    {
        for(int i=1; i<=n; i++)
            scanf("%d",&a[i]);
        memset(dp,0,sizeof(dp));
        int ans;
        for(int i=1; i<=n; i++)
        {
            ans=-INF;
            for(int j=0; j<i; j++)
                if(a[i]>a[j])
                    ans=max(ans,dp[j]);
            dp[i]=ans+a[i];
        }
        ans=-INF;
        for(int i=1; i<=n; i++)
            ans=max(ans,dp[i]);
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-08-04 07:45:04

hdu1087 最大递增子段和的相关文章

HDU1087 Super Jumping! Jumping! Jumping! 最大连续递增子段

Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 32561    Accepted Submission(s): 14689 Problem Description Nowadays, a kind of chess game called “Super Jumping!

HDU动规46 转载

HDU 动态规划(46道题目)倾情奉献~ [只提供思路与状态转移方程] 收藏 Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955     背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱  最脑残的是把总的概率以为是抢N家银行的概率之和… 把状态转移方程写成了f[j]=max{f[j],f[j-q[i].v]+q[i].money}(f[j]表示在概率j之下能抢的大洋);        正确的

转载:hdu 动态规划题集

1.Robberies 连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955     背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱  最脑残的是把总的概率以为是抢N家银行的概率之和… 把状态转移方程写成了f[j]=max{f[j],f[j-q[i].v]+q[i].money}(f[j]表示在概率j之下能抢的大洋);    正确的方程是:f[j]=max(f[j],f[j-q[i].money]*q[i

晚上跑步思考出来的几个题目,代码以后补上。

第一题 给定一个矩阵,打印输出顺时针旋转90°的矩阵. (创新工场和PPTV都有) 示例:输入矩阵是 1,  2,  3,  4 5,  6,  7,  8 9,  10,11,12 13,14,15,16 打印结果应该是 13, 9, 5, 1 14,10,6,2 15,11,7,3 16,12,8,4 找到规律就出来了. 考察点 (1)原地输出,空间复杂度为0(1). 空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度.如当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小

【转载】 HDU 动态规划46题【只提供思路与状态转移方程】

1.Robberies 连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱  最脑残的是把总的概率以为是抢N家银行的概率之和- 把状态转移方程写成了f[j]=max{f[j],f[j-q[i].v]+q[i].money}(f[j]表示在概率j之下能抢的大洋); 正确的方程是:f[j]=max(f[j],f[j-q[i].money]*q[i].v)  其

杭电dp题集,附链接

Robberies 点击打开链接 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱  最脑残的是把总的概率以为是抢N家银行的概率之和- 把状态转移方程写成了f[j]=max{f[j],f[j-q[i].v]+q[i].money}(f[j]表示在概率j之下能抢的大洋); 正确的方程是:f[j]=max(f[j],f[j-q[i].money]*q[i].v)  其中,f[j]表示抢j块大洋的最大的逃脱概率,条件是f[j-q[i].money]可达,也就是

实现技巧之分段

POJ3273 按每个月的权值进行分段 1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstdio> 5 #include<cstring> 6 #include<vector> 7 #include<set> 8 #include<queue> 9 #define pii pair<int,int>

hdu1087最长递增子序列

原题地址 简单dp题,LIS.不同之处是这里要求得的不是最长的子序列,而是权重和最长的子序列.其实大同小异. 状态数组就是到达每个位置的最大权重. LIS问题常用解法就是两个: 人人为我 我为人人 本题我用了我为人人的思路 .就是确定子序列起点,把其后面每一个大于它的值的位置的状态数组更新. #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using name

[C++] 动态规划之矩阵连乘、最长公共子序列、最大子段和、最长单调递增子序列

一.动态规划的基本思想 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解. 将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解.适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的.若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次.如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间.为了