1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 【动态规划刷题笔记】线性dp:合唱队形(最长递增子序列的变体)

【动态规划刷题笔记】线性dp:合唱队形(最长递增子序列的变体)

时间:2022-12-17 18:17:27

相关推荐

【动态规划刷题笔记】线性dp:合唱队形(最长递增子序列的变体)

[NOIP 提高组] 合唱队形 - 洛谷

思路:最少出列,即挑出最多,即找最长递增子序列和最长递减子序列

设dp1[i]为以h[i]结尾的最长递增子序列

dp2[i]为以h[i]开头的最长递减子序列

结果为n-(dp1[i]+dp2[i]-1)的最小值

注意max,min;

注意1~n还是0~n-1;

注意结果要-1(h[i]算2次)

如果思路对,举简单例子调试

#include<iostream>#include<algorithm>using namespace std;int n;int h[101];int dp1[101];//存放以h[i]为结尾的最长递增子序列的长度int dp2[101];//存放以h[i]为起点的最长递减子序列的长度 int main(){cin>>n;for(int i=0;i<100;i++){dp1[i]=1;dp2[i]=1;}for(int i=1;i<=n;i++){cin>>h[i];}dp1[0]=0;dp1[1]=1;for (int i = 2; i <= n; i++){for (int j = 1; j <= i - 1; j++){if (h[j] < h[i])dp1[i] = max(dp1[i], dp1[j] + 1);}}dp2[n - 1] = 1;for (int i = n - 2; i >= 0; i--) {for (int j = i + 1; j <= n - 1; j++){if (h[j] < h[i])dp2[i] = max(dp2[i], dp2[j] + 1);}}int res = 0;for (int i = 1; i <= n; i++){res = max(res, dp1[i] + dp2[i])-1;}cout << n-res;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。