原创 Wikioi 2572 路面修整

http://www.wikioi.com/problem/2572/ 趕腳挺不錯的一道DP。。。。 抄過來。 思路分析: 顯然(?)修整後的路面一定是原路面的某個值。 創建新數組c等於原數組,然後將c排序,f[i][j]表示原數組前i個

原创 1978: [BeiJing2010]取數遊戲 game

類似最長上升子序列的做法,只不過有個要求就是gcd必須要>l,這樣根號n枚舉因數,然後dp dp[i]表示以i作爲最大公因數可以選的數的最多個數  滿足gcd>l才更新dp #include<stdio.h> #include<algor

原创 Vijos 1061

題目中的按升序排列啓示了我們DP的順序,我們先考慮按升序DP,這時會發現決策的時候第i個必定是站在中間的,對答案不產生影響,故無法轉移,這樣就可以考慮倒着DP,從後往前進行DP。決策的時候需要注意,並不是一個一個的決策,而是兩個兩個的決策

原创 BZOJ 1831 中位數圖

容易發現對於每一個數,我們只需要知道他是否大於中位數(b),所以對於每一個數特殊處理一下,大於中位數的填1,小於的填-1,這樣問題就轉化爲了能選多少個子序列使得和爲0。 考慮到每一個數的範圍都在1~n之間,所以使用哈希的思想。 設pos表

原创 Vijos P1090連續數之和

維護前綴和 假設有一段前綴和i~j sum[j]-sum[i-1] mod k=0 顯然 sum[i-1] mod k=sum[j] mod k 這樣在讀入的時候我們可以統計mod k餘數爲r的個數。 在餘數相同的數中,任意兩個匹配都可以

原创 2697: 特技飛行

貪心。 其實只需要考慮每個活動執行兩次。 顯然大的放首尾。 #include<iostream> #include<algorithm> using namespace std; int c[100000]; int main() {

原创 Wikioi 1258 & Vijos 1150 關路燈

對於這道題目,顯然有以下結論 1.老張關掉的燈一定是呈一條直線的,不會出現間隔關燈的情況 2.老張關燈後所在的位置一定是在這條直線的兩端,要麼在最右段,要麼在最左端。 有了以上的兩個規律,這題也就很好寫了。 我們定義dp[i][j][k]

原创 1996: [Hnoi2010]chorus 合唱隊

   區間DP:     f[i][j][0]表示目標隊形中[i,j]這一段最左邊(i)是剛放上去的數的方案數    f[i][j][1]表示目標隊形中[i,j]這一段最右邊(j)是剛放上去的數的方案數   轉移是十分顯然的。

原创 BZOJ 1786 配對Pair

注意到-1的位置所填的數一定是不下降的,而且k的值非常的小,所以考慮DP。 設dp[i][j]表示在前i個-1的位置上,第i個-1的位置上填數字j所產生的最少逆序對數目,那麼求出來之後只需要加上開始時的逆序對數即可。 需要預處理出來兩個數

原创 Vijos P1006 晴天小豬歷險記

背景 Background   在很久很久以前,有一個動物村莊,那裏是豬的樂園(^_^),村民們勤勞、勇敢、善良、團結……   不過有一天,最小的小小豬生病了,而這種病是極其罕見的,因此大家都沒有儲存這種藥物。所以晴天小豬自告奮勇,要去

原创 2431: [HAOI2009]逆序對數列

考慮直接把答案作爲狀態進行DP(遞推) f[i][j]表示1~i產生j個逆序對數的可能有多少種。 對於第i個數,顯然他比1~i之間的數都要大,所以容

原创 Wikioi 1261 龍王的禮物

http://www.wikioi.com/problem/1261/ 繼續搬運。。。 用f[i][j]表示前j個數,取出來一些數,他們的和mod n爲i時,這個和的最大值.num[i][j]表示這個最大值的情況下,取的最少的塊數.a爲原

原创 洛谷 P1846 遊戲

給定兩個正整數數列,你要用它們來做一個遊戲:你需要對數列進行若干次操作,每一次操作,應選擇兩個正整數K1和K2 ,並刪除第一個數列的最後K1個數,計算出它們的和S1;刪除第二個數列的最後K2個數,計算出它們的和S2。這一次操作的得分就是(

原创 [Vijos1037]搭建雙塔

兩個揹包來防止重複。。   #include<cstdio> #include<cstring> bool dp[2000][2000]; int h[2000]; int main() { memset(dp,0,sizeo

原创 1037: [ZJOI2008]生日聚會Party

o(╯□╰)o看了題解纔會。。所以總結一下吧。。。 這道題是dp或者說是遞推。 顯然m,n要放到狀態裏,考慮直接用題目的答案來推答案。 問題是要保證相差個數不超過k來進行轉移,這裏轉移的時候是用前面的來推後面的。 一開始想用f[i,j,k