洛谷P2008-大朋友的数字(DP-最长不下降子序列)

简介: 洛谷P2008-大朋友的数字(DP-最长不下降子序列)

题目描述:


有一批大朋友(年龄15岁以上),他们每人手上拿着一个数字,当然这个数字只有1位,也就是0到9之间。每个大朋友的分数为在他之前的最长不下降子序列中所有数之和。(这个序列必须以它作为结尾!)如有多个最长不下降子序列,那么取编号字典序最小的。现在告诉你有n个大朋友,以及他们各自的数字,请你求出他们每个人的分数。


输入格式:


输入文件为bignum.in。


第一行,1个数n。


第二行,n个数,分别表示每个人的数字。


输出格式:


输出文件为bignum.out。


一行,n个数,分别表示每个人的分数。


输入输出样例:


输入 #1复制


【输入输出样例1】

5

1 2 5 3 4

【输入输出样例2】

5

1 7 5 9 6

输出 #1复制


【输入输出样例1】

1 3 8 6 10

【输入输出样例2】

1 8 6 17 12


说明/提示:


【样例解释1】


五个人分数分别为(1),(1+2),(1+2+5),(1+2+3),(1+2+3+4).


【样例解释2】


五个人分数分别为(1),(1+7),(1+5),(1+7+9){还有一个(1,5,9)},(1+5+6)。


【数据规模】


对于50%的数据,1≤n≤500;


对于80%的数据,1≤n≤1000;


对于100%的数据,1≤n≤10,000。


解题思路:



AC Code:  


#include<bits/stdc++.h>
using namespace std;
#define N 10010
int n,dp[N],sum[N],a[N];
int main() {
  scanf("%d",&n);
  for(int i=1;i<=n;i++) {
    scanf("%d",&a[i]);
  }
  for(int i=1;i<=n;i++) {
    sum[i]=a[i];
    for(int j=1;j<i;j++) {
      if(a[j]<=a[i]&&dp[i]<dp[j]+1) {
        dp[i]=dp[j]+1;
        sum[i]=sum[j]+a[i];
      }
    }
    printf("%d ",sum[i]);
  }
  return 0;
}

相关文章
|
7月前
|
算法 测试技术
【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字
【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字
【Leetcode -575.分糖果 -594.最长和谐子序列】
【Leetcode -575.分糖果 -594.最长和谐子序列】
56 0
|
6月前
|
存储
[TJOI2013]最长上升子序列 [SCOI2009]游戏
[TJOI2013]最长上升子序列 [SCOI2009]游戏
20 1
|
7月前
【错题集-编程题】最长公共子序列(一)(动态规划 - LCS)
【错题集-编程题】最长公共子序列(一)(动态规划 - LCS)
|
7月前
每日一题来噜!(记负均正,旋转数组中的最小数字)
每日一题来噜!(记负均正,旋转数组中的最小数字)
33 1
|
7月前
每日一题——旋转数组的最小数字(II)
每日一题——旋转数组的最小数字(II)
|
7月前
|
算法 Java
每日一题《剑指offer》数组篇之数组中出现次数超过一半的数字
每日一题《剑指offer》数组篇之数组中出现次数超过一半的数字
70 0
每日一题《剑指offer》数组篇之数组中出现次数超过一半的数字
|
7月前
|
人工智能 算法 Java
最长连续不重复子序列(蓝桥杯每日一题)
最长连续不重复子序列(蓝桥杯每日一题)
42 0
|
算法
代码随想录算法训练营第五十二天 | LeetCode 300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
代码随想录算法训练营第五十二天 | LeetCode 300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
50 1
|
7月前
|
算法 程序员 索引
【算法训练-动态规划 三】【双序列DP问题】最长重复子数组、最长公共子串、最长公共子序列、编辑距离
【算法训练-动态规划 三】【双序列DP问题】最长重复子数组、最长公共子串、最长公共子序列、编辑距离
106 0