codevs 1427 特種部隊 雙路DP

2021-08-01 07:19:11 字數 1562 閱讀 1314

題意:一排按鈕,從左邊的第乙個按鈕開始向右按動,中間可以跳過某些按鈕,按動到最右邊的按鈕後,反向向左按動。最終,每個按鈕都要按且僅按一次。每兩個相鄰按鈕上數字之差的總和的最小值,便是解開這把鎖的密碼。 

思路:

f[i][j]表示第一路擴充套件到i,第二路擴充套件到j的最優值.

對於max(i,j)後的一點k擴充套件

(1~max(i,j)可以看做是被兩路分成的兩段不連續序列)

則:f[i][k]=min(f[i][k],f[i][j]+s[j][k]);//2路.

f[k][j]=min(f[k][j],f[i][j]+s[i][k]);//1路.

最後列舉乙個所謂的斷點i求出貢獻(因為不確定n點在哪一路).

**:

#include#include#include#includeusing namespace std;

const int maxn = 1e3+5;

const int inf = 0x3f3f3f3f;

int dis[maxn][maxn], dp[maxn][maxn], a[maxn], n;

int main(void)

int ans = inf;

for(int i = 0; i <= n; i++)

printf("%d\n", ans);

}return 0;

}

思路2:

由於是雙向的,而且是走到最後乙個點再走回來

我們可以看做兩條路同時從最後那個點往回走(相當於兩條路有相同起點不同終點,除最後一點外,兩條路不能經過相同一點)

那麼可以在最先讀入陣列時就倒著儲存,後面動規時從前到後計算便於理解和推理

我們可以用乙個二維陣列來動規求解,

dp[i][j]表示兩條路分別走到i和j(i>j),並且從1到i的所有點都已經過

為了更直觀些,我們設兩條路分別為a和b,假設在乙個狀態下a走到i,b走到j

那麼現在可以推出幾個狀態。

狀態1:a上一步就在b的前面(那時b的位置狀態2:a上一步在b的後面(那時a所在位置然後驚訝的發現乙個迴圈套迴圈可以解決所有狀態

當j更新了dp[i][j],dp[i][i-1],然後dp[j][i],dp[i-1][i]也是相同道理

下面是**:

//serene

#include

#include

#include

#include

#include

#include

using namespace std;

const int maxn=1000+10;

const long long inf=1e18;

long long dp[maxn][maxn],ans=inf;//dp的二維分別代表兩次走到**

int n;int a[maxn];

int main()

for(int i=1;i<=n;++i)

ans=min(ans,dp[i][n]);//只要有乙個走到末尾就可以更新答案

cout}

RQNOJ PID204 特種部隊

看了一下題解,感覺題解貌似有些錯誤。所以把我的見解放在這裡,希望路過的大佬可以幫忙解釋一下 qaq 就是這裡的更新 dp i 1 i 和 dp i i 1 的時候,之前博主說的是 dp i j 表示第一條路走到了i第二條路走到了 j 並且 i j 且 1 rightarrow i 上的點都走過了。那...

RONOJ PID204 特種部隊

題目描述 某特種部隊接到乙個任務,需要潛入乙個倉庫。該部隊士兵分為兩路,第一路士兵已經在正面 牽制住了敵人,第二路士兵正在悄悄地從後方秘密潛入敵人的倉庫。當他們到達倉庫時候,發現這個倉庫的鎖是一把很詭異的電子鎖,上面是一排按鈕,每個按鈕 上都有乙個數字 10 秒鐘後,總部返回了該鎖的技術資訊。要解開...

集團軍和特種部隊

今天和幾個朋友一起吃飯,有兩個朋友目前是兩個企業的管理者,其中乙個朋友說了目前他們公司的乙個發展模式.這個朋友在技術管理方面非常出色並有自己獨特的見解,目前他們公司包括銷售,包括前台都讓他們參與軟體設計工作,而且有些人還做的很出色,他的理由是要盡可能的利用每乙個人的存在價值,能讓他們挖掘自己的價值,...