蓝桥杯OJ2049蓝桥勇士【动态规划】【dp[n]不是符合题意的答案,只是以an结尾的子问题的答案】

题目:

https://www.lanqiao.cn/problems/2049/learning/?page=1&first_category_id=1&sort=problem_id&asc=1&tag_relation=intersection&problem_id=2049https://www.lanqiao.cn/problems/2049/learning/?page=1&first_category_id=1&sort=problem_id&asc=1&tag_relation=intersection&problem_id=2049

思路:

cpp 复制代码
如果小明最后一个挑战的对手是an,那么小明最多挑战了dp[n]个对手,但是不一定dp[n]就
是dp[]数组中的最大值,所以要遍历dp[]数组找最大值,才是小明一路挑战对手的最大值
样例【a1,a2,...an中战力并没有说是递增的】:[2, 1, 3, 4, 5, 0]
 逐位计算 dp:
 dp[1] = 1(2)
 dp[2] = 1(1)
 dp[3] = 2([1,3]/[2,3],长度 2)
 dp[4] = 3([1,3,4],长度 3)
 dp[5] = 4([1,3,4,5],长度 4)
 dp[6] = 1(0,前面没有比它小的,长度 1)
 全局最长递增子序列长度是 4(dp[5]),而最后一个 dp[6] = 1,远小于最大值!

可执行代码:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+10;
long long a[N];
long long dp[N];//小明遇到的前N个对手:a1,a2,...aN中,如果小明最后一个挑战的对手是aN,那么小明最多挑战了dp[N]个对手
int main()
{
  int n=0;cin>>n;
  for(int i=1;i<=n;i++) cin>>a[i];
  dp[0]=0;//小明遇到的前0个对手中,小明挑战的对手最多有0个
for(int i=1;i<=n;i++){
  dp[i]=1;
  for(int j=1;j<i;j++){//遍历一下i前面的,看看当前下标i前面有没有比a[i]小的元素
    if(a[i]>a[j]) dp[i]=max(dp[i],dp[j]+1);//dp[i]和前面的元素相比肯定是等于或者加1
  }
}
long long ans=0;
for(int i=1;i<=n;i++){
  ans=max(ans,dp[i]);
}
  cout<<ans;
  return 0;
}

通过样例:

相关推荐
Omics Pro1 分钟前
1个月2轮融资!长寿虚拟细胞
数据库·人工智能·算法·机器学习·自然语言处理
residual_fan2 分钟前
航空发动机故障诊断专用智能体(六):实际机队健康管理中的应用考量与展望
人工智能·算法·数据挖掘·数据分析
码匠许师傅12 分钟前
【C++三方组件】cxxopts:轻量首选的命令行解析
c++
hansang_IR24 分钟前
【讲解】CSP-S2026 第一轮初赛
c++·算法
hanlin0326 分钟前
刷题笔记:力扣第76题-最小覆盖子串
笔记·算法·leetcode
Zane199428 分钟前
比较排序跑不出O(nlogn)是数学上证明过的,计数、桶、基数排序凭什么能绕开这堵墙
算法·排序算法
tiger86529 分钟前
大语言模型面试和题解,梳理中国主流开源 LLM 系列的发展脉络、技术路线与工程取舍
人工智能·gpt·深度学习·算法·自然语言处理·面试·transformer
Methy33 分钟前
IoTHub半个月崩了五次?都是裸rethrow惹的祸
服务器·c++·后端
我不会起名字32242 分钟前
一天一道力扣Hot100(36):深度优先算法---组合总和
数据结构·c++·后端·python·算法·go
纪念 2291 小时前
c++类和对象(四)
开发语言·c++