最大花之能量
问题描述
在一个神奇的王国里,有一个美丽的花园,里面生长着各种奇妙的花朵。这些花朵都有一个特殊的能力,它们能够释放出一种叫做「花之能量」的神秘力量。每朵花的花之能量都不同,它们的能量值用整数表示。
花园里住着四个好朋友:小兰、坤坤、妮妮和依依。他们都非常喜欢花园里的花朵,尤其是那些能量值特别高的花朵。他们认为,只要他们能够找到一种特殊的方法,就可以从花园里的花朵中获得最大的花之能量。
给定花园中的花朵能量序列 (a1,a2 ,…,aN),你需要帮助他们找到一种方法,使得他们能够获得最大的花之能量。这种方法是这样的:从序列中选择一些花朵,组成一个新的序列(ai1 ,ai2 ,…,aiK),其中 1≤i1 <i2<…<iK ≤N,并且这个新序列是一个严格递增序列。
他们的目标是求出这种方法中能够获得的最大花之能量的总和。
你需要编写一个程序,根据给定的花朵能量序列,计算出他们能够获得的最大花之能量的总和。
输入格式
输入的第一行是序列的长度 N。
第二行给出序列中的 N 个整数 a1 ,a2 ,a3 ⋯an ,表示花朵的能量值。
数据范围保证:1≤N≤103,1≤ai ≤104。
输出格式
输出一个整数,表示他们能够获得的最大花之能量的总和。
样例输入
7
8 3 5 9 4 6 7
样例输出
21
动态规划
#include<bits/stdc++.h> // 引入常用的头文件,包含STL库等
using namespace std; // 使用标准命名空间
int a[1010],dp[1010]; // 声明两个数组a和dp,大小为1010,a存储花之能量,dp存储状态转移过程中的最大和
int main() // 程序的主函数
{
int n; // 声明整数变量n,用于保存花朵的总数
cin >> n; // 从标准输入读取花朵总数
int res = 0; // 声明整数变量res并初始化为0,用于记录最大花之能量的总和
// 输入花之能量序列
for(int i = 1; i <= n; i++) // 从1遍历到n,读取每朵花的能量
cin >> a[i]; // 从标准输入读取每朵花的花之能量并存储在数组a中
// 计算最大花之能量的和
for(int i = 1; i <= n; i++) // 主循环,从1遍历到n,以计算到第i朵花为止的最大花之能量和
{
dp[i] = a[i]; // 初始化dp[i]为a[i],表示最小的上升子序列可以只包含自己
for(int j = 1; j < i; j++) // 从1遍历到i-1,寻找所有可能的子序列的前一个花朵
{
if(a[j] < a[i]) // 如果a[j]的能量值小于a[i]的能量值,说明可以形成一个上升子序列
dp[i] = max(dp[i], dp[j] + a[i]); // 更新dp[i]为dp[j]+a[i]和dp[i]中较大的值,实现状态转移
}
res = max(res, dp[i]); // 更新res为res和dp[i]中较大的值,即到目前为止的最大花之能量
}
cout << res; // 输出最终的最大花之能量
return 0; // 主函数返回0,正常结束程序
}
这段代码实现了一个经典的动态规划问题,用于求解最长递增子序列的和。
dp[i]
存储了以a[i]
为结尾的最长递增子序列的和。- 外部循环用于遍历所有花朵。
- 内部循环用于找到所有小于当前花朵能量值的花朵,并尝试更新
dp[i]
。 res
变量用于在每次迭代之后保存到目前为止找到的最大和,最后输出该值。