• 杭电1087


    题意:求递增子序列的和的最大值。

    Analyse:一开始想到的居然是把每个格子的加或不加都计算一次然后放在数组里面,再想一下发觉这就是暴力了。之后还是想到了动态规划的方法,因为a[n]能不能加进去只跟之前的子序列最后一个元素的大小有关,所以如果a[n]能加进去某个子序列里面的话,只需要用到这个子序列的最优解(而不需要其他情况的),而且要使a[n]为尾的子序列的和最大,要选一个之前的最大的子序列。因此递推式为dp[n]=max{dp[i],i=0,1,2......n-1}+a[n]或dp[n]=a[n]。

    View Code
     1 #include<iostream>
     2 using namespace std;
     3 int a[1000];
     4 int dp[1000];
     5 int main()
     6 {
     7     int n,i,j,max;
     8     while(cin>>n && n)
     9     {
    10         for(i=0;i<n;i++)
    11             cin>>a[i];
    12         for(i=0;i<n;i++)
    13         {
    14             for(max=0,j=0;j<i;j++)
    15             {
    16                 if(a[j]<a[i] && max<dp[j])
    17                     max=dp[j];
    18             }
    19             dp[i]=max+a[i];
    20         }
    21         max=dp[0];
    22         for(i=1;i<n;i++)
    23         {
    24             if(max<dp[i])
    25                 max=dp[i];
    26         }
    27         cout<<max<<endl;
    28     }
    29     return 0;
    30 }
  • 相关阅读:
    c# 集合的交集、并集、差集
    git版本控制
    jquery html动态添加的元素绑定事件详解
    Binding笔记
    动画
    MSSQL 索引
    TCP和UDP的优缺点及区别
    Fetch API 了解 及对比ajax、axois
    提供图片服务网站
    2017 jq 总结
  • 原文地址:https://www.cnblogs.com/ZShogg/p/2649624.html
Copyright © 2020-2023  润新知