【題目描述】
小m很喜歡找點遊戲自娛自樂。有一天,她在紙上寫了一串數字:1,1,2,5,4。接著她擦掉了乙個1,結果發現剩下1,2,4都在自己所在的位置上,即1在第1位,2在第2位,4在第4位。她希望擦掉某些數後,剩下的數列中在自己位置上的數盡量多。她發現這個遊戲很好玩,於是開始樂此不疲地玩起來……不過她不能確定最多能有多少個數在自己的位置上,所以找到你,請你幫忙計算一下!
第一行為乙個數n,表示數列的長度。
接下來一行為n個用空格隔開的正整數,第i行表示數ai。
一行乙個整數,表示擦掉某些數後,最後剩下的數列中最多能有多少個數在自己的位置上,即ai=i最多能有多少。
1 1 2 5 4
對於20%的資料,n≤20;
對於60%的資料,n≤100;
對於100%的資料,n≤l000
1 #include2 #include345view codeusing
namespace
std;67
8int
main()9;
13int dp[1010]=;
14int n;int
max;
15 cin>>n;
16int
i,j;
17for(i=1;i<=n;i++)
18 cin>>ac[i];
19for(i=1;i<=n;i++)
2026 max=0;27
for(j=0;j)
28if(ac[i]>ac[j])
29if((ac[i]-ac[j])<=(i-j))
3033 dp[i]=max+1;34
}35 max=0;36
for(i=1;i<=n;i++)
37if(dp[i]>max)max=dp[i];
38 cout
39return0;
40 }
**分析:
其實該題就是求最長遞增子串行;只不過是加了一些附加的條件;
首先,應該是該元素的值應該大於等於該元素的下標;否則不行,即賦值為0;
其次,元素之差要小於等於下標之差;
在上邊這些條件下找出dp陣列中第i個元素前的最大值加1賦給dp[i];
最後在dp陣列中尋找最大值然後輸出;
NOIP2010衝刺十三 逃離遺跡
根據外星人的回信,在遺跡分布著三樣道具。當三樣道具都拿走後,遺跡就很快自動毀滅,所以必須要在最短時間內離開。遺跡可以看作是由n個房間 編號1.n 和n l條長度不等通道所組成,並且任意兩個房間之間有且只有一條路可以相互到達。現在我們的隊員已經在編號為a,b,c的房間內拿到道具,並且準備撤退。由於只有...
找位置 衝刺 noip
找位置 測試區 題目 farmer john 想找乙個最好的位置來建新農場,這樣他每天可以少走些路。fj 所在的區域,有n 個城鎮 1 n 10,000 城鎮之間,有m 1 m 50,000 條雙向路相連。所有城鎮都可以借助一些路相互連線。fj 需要你的幫助來選擇最合適建新農場的城鎮。k 1 k 5...
noip衝刺賽 迴圈整數
問題描述 mored 在學習完迴圈小數之後發現迴圈是個很美好的性質。自己只需要記住短短的迴圈 節以及迴圈次數 次數大於 1,且是整數 就可以記住整個數字了。因為背誦數字變得方便了,mored 決定背誦 l,r 內的所有迴圈的整數。mored 的背誦 計畫有 t 天,但是他不知道每天具體要背多少個數,...