日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CometOJ#6 双倍快乐(简单DP)

發(fā)布時(shí)間:2023/12/13 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CometOJ#6 双倍快乐(简单DP) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

鏈接:https://www.cometoj.com/contest/48/problem/B

題意:給出一串?dāng)?shù)列,要求在這個(gè)數(shù)列中找出兩條“不相交”的非下降子序列使得子序列之和最大。“不相交”即不存在任意的ai同時(shí)存在于兩個(gè)子序列中。

分析:筆者刷題量不多,這道題對筆者加深動(dòng)態(tài)規(guī)劃求子序列的理解很有幫助;題目要求非下降子序列的最大和,這里我們要求的是兩條子序列。做題時(shí)的第一想法是走兩遍DP,先求出一條和最大的子序列,把這條子序列中的元素給剔除,接著再重復(fù)該步驟,得到另一條和最大的子序列,最后把兩條子序列的和加起來。但是,這種做法是存在后效性的,我們的目的是要求得兩條子序列的和最大,如果每次只是單純的找和最大的子序列,那么很有可能在第一次選元素時(shí)就斷了使得子序列總和最大的“橋梁”。好比方說:5 4 4 5 4;通過該方案得到的兩條序列會(huì)是:“4 4 5”、“5”,最終結(jié)果是18。但最優(yōu)的方案其實(shí)是:“4 4 4”、“5 5”,結(jié)果為22。

  設(shè)dp[i][j]為兩條子序列的末端分別為i和j時(shí)的子序列和,dp[0][0] = 0;其狀態(tài)轉(zhuǎn)移方程可以由單個(gè)子序列的轉(zhuǎn)移方程推廣得到,詳見代碼部分。

1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int main() { 6 int n; 7 scanf("%d",&n); 8 9 int num[n+1]; 10 num[0] = 0; 11 for (int i=1;i<=n;i++) { 12 scanf("%d",&num[i]); 13 } 14 15 int dp[n+1][n+1]; 16 memset(dp,0,sizeof(dp)); 17 int ans = 0; 18 for (int i=1;i<=n;i++) { 19 for (int j=0;j<i;j++) { 20 if (num[i] >= num[j]) { 21 for (int k=0;k<i;k++) { 22 dp[i][k] = max(dp[i][k],dp[j][k] + num[i]); 23 dp[k][i] = max(dp[k][i],dp[k][j] + num[i]); 24 ans = max(ans,max(dp[i][k],dp[k][i])); 25 } 26 } 27 } 28 } 29 printf("%d\n",ans); 30 return 0; 31 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/doublebit/p/11105845.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的CometOJ#6 双倍快乐(简单DP)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。