動態規劃之數字三角形模型+最長上升子序列模型

首先,我們從集合角度重新看待DP:

直接看題:https://www.acwing.com/problem/content/1029/

就是取紙條的原題,我們令f[i1,j1,i2,j2]表示從(1,1),(1,1)分別走到(i1,j1),(i2,j2)的路徑的max

i1+j1==i2+j2,于是我們可以把狀態變為f[k,i1,i2]表示走到(i1,k-i1),(i2,k-i2)的最大值。

對于最后一個狀態,我們可以按照上下分成4中,同時轉移時重合的化加w[i][j],否則就分別加一個

下面是AC代碼:

#include <iostream>
#include <algorithm>using namespace std;const int N = 15;int n;
int w[N][N];
int f[N * 2][N][N];int main()
{scanf("%d", &n);int a, b, c;while (cin >> a >> b >> c, a || b || c) w[a][b] = c;for (int k = 2; k <= n + n; k ++ )for (int i1 = 1; i1 <= n; i1 ++ )for (int i2 = 1; i2 <= n; i2 ++ ){int j1 = k - i1, j2 = k - i2;if (j1 >= 1 && j1 <= n && j2 >= 1 && j2 <= n){int t = w[i1][j1];if (i1 != i2) t += w[i2][j2];int &x = f[k][i1][i2];x = max(x, f[k - 1][i1 - 1][i2 - 1] + t);x = max(x, f[k - 1][i1 - 1][i2] + t);x = max(x, f[k - 1][i1][i2 - 1] + t);x = max(x, f[k - 1][i1][i2] + t);}}printf("%d\n", f[2*n][n][n]);return 0;
}

接題:https://www.acwing.com/problem/content/189/

看到數據范圍可以確定爆搜(BFS因為一層層存儲量太大不推薦),這樣就轉換成導彈攔截的思路了:從前往后,對于一個導彈找到比他高的min插入即可,若沒有就再開一個(注意防御系統一定是遞增的)

下面是AC代碼:

#include<bits/stdc++.h>
using namespace std;
int n;
int a[10001];
int ans=50;
int up[100010],down[10000];
void dfs(int x,int u,int d)
{if(u+d>=ans) return;if(x==n+1){ans=min(ans,u+d);return;}//先上int f=-1;for(int i=1;i<=u;i++){if(up[i]>a[x]){f=i;break;}if(i==u) f=-1;}if(f==-1){up[u+1]=a[x];dfs(x+1,u+1,d);up[u+1]=0;}else{int t=up[f];up[f]=a[x];dfs(x+1,u,d);up[f]=t;}f=-1;for(int i=1;i<=d;i++){       if(down[i]<a[x]){f=i;break;}if(i==d) f=-1;}if(f==-1){down[d+1]=a[x];dfs(x+1,u,d+1);down[d+1]=0;}else{int t=down[f];down[f]=a[x];dfs(x+1,u,d);down[f]=t;}
}
int main()
{while(cin>>n){if(!n) break;for(int i=1;i<=n;i++) cin>>a[i];memset(up,0,sizeof(up));memset(down,0,sizeof(down));ans=50;dfs(1,0,0);cout<<ans<<endl;}
}

接題:https://www.acwing.com/problem/content/1018/

確定f[i][j]的集合:由第一個序列前i個字母,第二個前j個并以b[j]的公共上升子序列。

表示max,然后考慮計算:先按是否包含a[i]分成兩類:不包含:f[i-1][j],包含:a[i]==b[j]

我們又可以把b分為以b[1]...b[j-1]以及空,對于b[k]就是f[i-1][k]+1

下面是AC代碼:

#include<bits/stdc++.h>
using namespace std;
int n,a[100010],b[100010];
int dp[3010][3005];
int main()
{cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) cin>>b[i];for(int i=1;i<=n;i++){int maxv=0;for(int j=1;j<=n;j++){dp[i][j]=dp[i-1][j];if(a[i]==b[j]){dp[i][j]=max(dp[i][j],1);dp[i][j]=max(dp[i][j],maxv);}if(b[j]<a[i]) maxv=max(maxv,dp[i-1][j]+1);}}int res=0;for(int i=1;i<=n;i++) res=max(res,dp[n][i]);cout<<res;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43867.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43867.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43867.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

機器學習 | 對K-Means聚類假設的研究演示及實踐示例

我們在Scikit-learn對K-means假設的調查中探索了揭示算法優勢和局限性的場景。我們研究了K-means對不正確的聚類大小的敏感性&#xff0c;它在各向異性分布中面臨的困難&#xff0c;它在不同的聚類方差中面臨的困難&#xff0c;以及使用合成數據集的大小不均勻的聚類問題。我們…

準備工作+1、請求和響應+2、模型和管理站點

Django快速入門——創建一個基本的投票應用程序 準備工作1、創建虛擬環境2、安裝django 1、請求和響應&#xff08;1&#xff09;創建項目&#xff08;2&#xff09;用于開發的簡易服務器&#xff08;3&#xff09;創建投票應用&#xff08;4&#xff09;編寫第一個視圖1、編寫…

家用激光投影儀品牌排行榜:這幾個品牌口碑好產品好最適合家用

現在人們生活水平提升&#xff0c;對投影這類產品的認知接受度也提升&#xff0c;有條件的家庭都想在家里整一個家庭影院&#xff0c;對于這些消費者來說挑選一臺性價比高的家用投影至關重要&#xff0c;既省到錢又買對了產品&#xff1b;投影市場發展迅速目前市面上大大小小的…

華為機考真題 -- 多段線數據壓縮

題目描述: 下圖中,每個方塊代表一個像素,每個像素用其行號和列號表示,但可以發現,這種表示不是最簡的,其實只需要存儲 6 個藍色的關鍵點即可,它們是線段的起點、拐點、終點,而剩下 4 個點是冗余的。現在,請根據輸入的包含有冗余數據的多段線坐標列表,輸出其最簡化的…

mongo數據庫遷移

前言 mongo數據庫遷移的方式目前常見的有兩種&#xff1a; 1&#xff0c;mongodump與mongorestore 2&#xff0c;mongoimport與mongoexport 二者主要區別有&#xff1a; 1、mongoexport 可以導出json和csv格式&#xff0c; mongodump導出的是bson可讀性不如前者 2&#xff0c;…

在Windows 10上快速顯示桌面的幾種方法,總有一種適合你

序言 有時你需要在Windows 10中快速查看你的桌面,但你不想乏味地最小化每個打開的應用程序窗口,或者移動它們并丟失它們的布局。幸運的是,有幾種方法可以讓你快速查看桌面,然后從你停止的地方重新開始。 如何使用任務欄按鈕顯示桌面 假設你正在隨意瀏覽你最喜歡的網站,…

服了,jenkins找不到advanced

新手下載的最新版本&#xff0c;過新手入門的時候一直過不去&#xff0c;就跳過了。 想下載一個漢化&#xff0c;還下載不了。根據提示搜索&#xff0c;結果大家讓去advanced找url&#xff0c;也找不到。

nginx重啟命令linux步驟是什么?

1、驗證nginx配置文件是否正確 方法一&#xff1a;進入nginx安裝目錄sbin下&#xff0c;輸入命令./nginx -t 看到如下顯示nginx.conf syntax is ok nginx.conf test is successful 說明配置文件正確! 方法二&#xff1a;在啟動命令-c前加-t 2、重啟Nginx服務 方法一&#xff1a…

FreeRTOS 隊列

隊列是一種任務到任務、任務到中斷、中斷到任務數據交流的一種機制。在隊列中可以存 儲數量有限、大小固定的多個數據&#xff0c;隊列中的每一個數據叫做隊列項目&#xff0c;隊列能夠存儲隊列項 目的最大數量稱為隊列的長度&#xff0c;在創建隊列的時候&#xff0c;就需要指…

揭秘與應對:病毒偽裝文件夾的數據恢復策略

在數字時代&#xff0c;數據安全是每個人不可忽視的重要議題。而偽裝文件夾&#xff0c;作為一種狡猾的數據安全威脅&#xff0c;正逐漸浮出水面&#xff0c;成為用戶需要警惕的對象。這些偽裝文件夾看似普通&#xff0c;實則隱藏著不為人知的秘密&#xff0c;它們通過模仿正常…

linux系統操作/基本命令/vim/權限修改/用戶建立

Linux的目錄結構&#xff1a; 一&#xff1a;在Linux系統中&#xff0c;路徑之間的層級關系&#xff0c;使用:/來表示 注意:1、開頭的/表示根目錄 2、后面的/表示層級關系 二&#xff1a;在windows系統中&#xff0c;路徑之間的層級關系&#xff0c;使用:\來表示 注意:1、D:表示…

數電票真偽查驗接口、發票查驗接口

數電發票是現代稅務系統升級的重要體現&#xff0c;因其開票流程簡化、發票信息全面數字化、票面版式簡潔化、高效環保等優勢&#xff0c;深受納稅人好評。但隨之而來的數電票真偽查驗問題也讓各位財務小伙伴頭疼不已&#xff0c;那么&#xff0c;數電票如何實現快速、批量、精…

移動應用性能收集工具原理解析

性能收集分析相關工具總覽 收集、分析、展示移動應用性能數據的工具很多&#xff0c;大致可以分為如下幾類。例如可收集多項性能指標的移動性能工具&#xff0c;perfdog&#xff0c;Solopi&#xff0c;其中Solopi開源&#xff0c;pefdog商業工具。可進行Crash分析的工具&#x…

貓超卡怎么使用?

天貓超市卡好像只能買天貓的東西 但是有時候淘寶、京東打折比天貓的單價還便宜 這樣的話&#xff0c;貓超卡好像也沒多大用處 這不&#xff0c;上個月618湊單的東西比在天貓超市買劃算多了 最后我直接把貓超卡在收卡云上折現了&#xff0c;超劃算

Chmod 特殊權限舉例

chmod 4777 的例子&#xff1a; 比如&#xff0c;在安裝某些服務如PostgreSQL時&#xff0c;服務的初始化腳本&#xff08;如initdb&#xff09;可能需要以超級用戶(root)的權限運行&#xff0c;以執行一些系統級的操作。在這種情況下&#xff0c;如果你設置 initdb 腳本為 ch…

flink 大數據處理資源分配

Flink在大數據處理中的資源分配是一個復雜但至關重要的過程&#xff0c;它直接影響到作業的性能和穩定性。以下將從幾個方面詳細闡述Flink的資源分配機制和優化策略&#xff1a; 一、資源分配概述 Flink是一個用于無界和有界數據流處理的分布式計算框架&#xff0c;它通過集群…

Git-Updates were rejected 解決

Updates were rejected 1. 雜話2. 問題3. 解決3.1 拉去遠程的最新版本&#xff08;AC&#xff09;3.2 解決可能的沖突3.3 提交3.4 再次推送 1. 雜話 大伙兒應該都用過Git吧&#xff0c;具體是個啥東西我就不說了哈。之前我在用git push的時候遇到了這個報錯&#xff0c;我仔細思…

C/C++開發,IniFile源碼下載

C/C開發&#xff0c;IniFile源碼下載。 地址&#xff1a;CIniFile download | SourceForge.net

編程學單詞:delta(希臘字母Δ/δ)

希臘字母表的第四個字母&#xff0c;大寫為Δ&#xff0c;小寫為δ。 (筆記模板由python腳本于2024年07月11日 12:32:56創建&#xff0c;本篇筆記適合喜歡寫代碼&#xff0c;更喜歡鼓搗Python的coder翻閱) 【學習的細節是歡悅的歷程】 Python 官網&#xff1a;https://www.pyth…

算法 | NOIP1999 Cantor表

算法篇——Cantor的數表 - SteveWang - 博客園 (cnblogs.com) #include <bits/stdc.h> using namespace std; int high(int n) {return n*(n1)/2; } int main() {int k;cin>>k;int n1;while(1){if(high(n)>k){break;}n;} int mhigh(n);int wm-k1;if(n%20){cout…