題意:一排按鈕,從左邊的第乙個按鈕開始向右按動,中間可以跳過某些按鈕,按動到最右邊的按鈕後,反向向左按動。最終,每個按鈕都要按且僅按一次。每兩個相鄰按鈕上數字之差的總和的最小值,便是解開這把鎖的密碼。
思路:
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 秒鐘後,總部返回了該鎖的技術資訊。要解開...
集團軍和特種部隊
今天和幾個朋友一起吃飯,有兩個朋友目前是兩個企業的管理者,其中乙個朋友說了目前他們公司的乙個發展模式.這個朋友在技術管理方面非常出色並有自己獨特的見解,目前他們公司包括銷售,包括前台都讓他們參與軟體設計工作,而且有些人還做的很出色,他的理由是要盡可能的利用每乙個人的存在價值,能讓他們挖掘自己的價值,...