題意:很多肥老鼠認為,長的越肥,奔跑速度就越快,為了反駁這個觀點,你現在需要對老鼠的體重和速度進行研究,你要在老鼠序列中找出乙個子串行,使得老鼠的體重在增加,但是速度卻在減慢input
輸入以eof結束。輸入中每行有兩個正整數,分別表示老鼠的體重和速度,範圍均在1到10000之間,輸入資料最多有1000只老鼠。某些老鼠可能有相同的體重,某些老鼠可能有相同的速度,某些老鼠可能體重和速度都相同。
output
我們是要在原來的老鼠序列中,找到乙個最長的子串行,使得這個子串行中老鼠的體重在嚴格增加,速度卻在嚴格降低。
首先輸出滿足條件的最長的子串行的長度。
其次,輸出乙個最長子序列的方案,要求輸出每個老鼠在輸入時候的編號,每個編號佔一行,任意一種正確的方法都會被判正確。
給出乙個例題,不過這個例題中的輸出資料應該是 :
445兩個序列進行比較,可以先用sort把乙個序列的順序排好,然後考慮另乙個序列。97
★記錄路徑
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表...