DP 路徑記錄

2021-09-09 06:20:36 字數 1279 閱讀 2443

題意:很多肥老鼠認為,長的越肥,奔跑速度就越快,為了反駁這個觀點,你現在需要對老鼠的體重和速度進行研究,你要在老鼠序列中找出乙個子串行,使得老鼠的體重在增加,但是速度卻在減慢 

input 

輸入以eof結束。輸入中每行有兩個正整數,分別表示老鼠的體重和速度,範圍均在1到10000之間,輸入資料最多有1000只老鼠。某些老鼠可能有相同的體重,某些老鼠可能有相同的速度,某些老鼠可能體重和速度都相同。 

output 

我們是要在原來的老鼠序列中,找到乙個最長的子串行,使得這個子串行中老鼠的體重在嚴格增加,速度卻在嚴格降低。 

首先輸出滿足條件的最長的子串行的長度。 

其次,輸出乙個最長子序列的方案,要求輸出每個老鼠在輸入時候的編號,每個編號佔一行,任意一種正確的方法都會被判正確。

給出乙個例題,不過這個例題中的輸出資料應該是 :

445

97

兩個序列進行比較,可以先用sort把乙個序列的順序排好,然後考慮另乙個序列。

記錄路徑

while(temp)

在剛開始dp尋找最長序列的時候,已經記錄了此時的下標。

在前面有:

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

}

其中的load[i]就是說在計算第i個數的時候,與它相連的前乙個數是j,並且用load陣列記錄下來!!!

這樣,通過load可以把各個數給聯絡起來。

那麼也就有了上乙個方框裡面while迴圈裡面的 temp=load[temp];也就是改變此時的值。

這個時候再用乙個陣列ans記錄下來出現的數的下標,在最後進行輸出。

因為記錄下標的時候是逆向的,所以輸出的時候也要是逆向的,並且ans只是說是第幾個數,還要轉化成具體的位數進行輸出。

#include#include#include#includeusing namespace std;

struct xiao

a[10005];

bool cmp(xiao a,xiao b)

}int temp=maxi;

int x=0;

while(temp)

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

for(int i=maxl-1;i>=0;--i)

return 0;

}

poj3003 2397 DP 記錄路徑

這兩題是一模一樣的 最近做了好多這種揹包的題,但是這題需弄清的地方還是不少,有些繞 f陣列其實是可以省的 include define oo 10000000 using namespace std int cas,n,a 1010 p,q,dp 2 1010 pre 41 1010 bool f ...

記錄路徑dp 4713 Permutation

題目大意 題意同hdu 3092這不過這題要輸出路徑。解題思路 思路同hdu 3092。因為n比較大,不能開二維只記錄前面乙個來 逆著存路徑。所以對於每個狀態,把到達它的所有數都儲存下來。轉移的時候將前面的路徑也賦值過來。dp i 表示表示不超過i的能分成的最大的最小公倍數的對數。少了的話用1來湊。...

UVA 624 記錄路徑dp

總得來說,不管是01揹包還是完全揹包,其動態轉移每次只有兩種狀態在轉移,就說這道題目,dp i j max dp i 1 j dp i 1 j v i val i 對於dp i j 來說,它只能使由兩個狀態中的乙個轉移過來的,要麼取一件,要麼不取,那麼我們再開乙個二維陣列s i j 0表示不取,1表...