kuangbin專題 基礎DP(部分題的思路)

2021-10-06 22:04:42 字數 3520 閱讀 7893

1.max sum plus plus

題意:給出n個整數a1,a2,… ,an及正整數m,求最大m個不相交子段和。

解題思路:用dp[i][j]表示從前j個數中恰好選出i組數的最大和 ,就有dp[j][j]=max(dp[i][j−1]+a[j],max(dp[i−1][i-1~j-1])+a[j])。可以看到每一層的dp僅與上一層有關係,所以可以建立乙個陣列存上一層的最大值,就可以用一維的dp解決問題。

#include

#define inf 0x3f3f3f3f

using

namespace std;

int dp[

1000005

],mmax[

1000005

],a[

1000005];

intmain()

} cout<"\n";}

return0;

}

2.ignatius and the princess iv

題意:給出奇數n和n個整數,找出其**現次數≥(n+1)/2的數。

解題思路:貌似開了個桶救過了???

#include

#define ll long long

using

namespace std;

int t[

100005];

intmain()

cout<"\n";}

return0;

}

3.monkey and banana

題意:給出n種方塊(每種方塊的數目無限),給出每種方塊的長寬高,當底面的兩個尺寸分別都嚴格小於另乙個方塊的兩個尺寸,可以將其疊上去,求用這些方塊能疊的最高高度。(注意:方塊可以按需求重新定義地面)

解題思路:我覺得是最長上公升子串行的變種,用結構體儲存方塊型別(這裡我是一種拆成三種算,顯然底面相同的方塊只能使用一次,排序完之後直接簡單dp)。

#include

using

namespace std;

#define ll long long

#define fo(i,n) for(int i=0;istruct hhh

;bool

cmp(hhh a,hhh b)

intmain()

sort

(h,h+s,cmp)

; ll dp[

1005];

fo(i,s)dp[i]

=h[i]

.z;for

(int i=

0;i)for

(int j=

0;j(h[j]

.x>h[i]

.x&&h[j]

.y>h[i]

.y) dp[i]

=max

(dp[i]

,dp[j]

+h[i]

.z);

ll m=0;

fo(i,s)m=

max(m,dp[i]);

printf

("case %d: maximum height = "

,qi)

; cout<"\n";}

}

4.super jumping! jumping! jumping!

題意&解題思路:最大上公升子串行和。直接貼**吧。

#include

using

namespace std;

intmain()

for(

int i=

0;isort

(dp,dp+n)

; cout<<<

"\n";}

}

5.piggy-bank

題意&解題思路:完全揹包問題。

#include

#include

using

namespace std;

intmain()

}if(f[m]

==100000007

)cout<<

"this is impossible.\n"

;else cout<<

"the minimum amount of money in the piggy-bank is "

<<<

".\n";}

return0;

}

6.tickets

題意:賣電影票的joe希望能早點回家,他可以單獨賣給乙個人或者同時賣給相鄰的兩個人,你是上帝知道賣給每個人和每相鄰兩個人的時間,會dp的你能幫幫他嗎?

解題思路:設dp[i]為買票給前i個人花費的最小時間,a[i]為第i個人單獨買票花費的時間,b[i]為第i個人和他前乙個人一起買票所花費的時間,則有狀態轉移方程:dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i])。(注意12小時制和輸出前導零)

#include

#define ll long long

#define intq() int qq;cin>>qq;while(qq--)

using

namespace std;

intmain()

return0;

}

7.最少攔截系統

題意:有n發飛彈按順序來襲,現有一種攔截系統能攔截飛彈,但攔截的每一發炮彈都不能超過前一發的高度,求最少需要幾套攔截系統。

解題思路:其實就是最長上公升子串行。

#include

using

namespace std;

intmain()

int maxx=0;

for(

int i=

0;i) maxx=

max(maxx,dp[i]);

}}cout<"\n";}

return0;

}

#include

#include

using

namespace std;

intmain()

a.insert

(p);

} cout

<<

"\n";}

}

8.longest ordered subsequence

題意&解題思路:還是最長上公升子串行。

#include

#define ll long long

using

namespace std;

int dp[

1005];

int a[

1005];

intmain()

for(

int i=

0;iint m=0;

for(

int i=

0;i) cout

}

kuangbin帶你飛專題

kuangbin帶你飛 專題一 簡單搜尋 kuangbin帶你飛 專題二 搜尋高階 kuangbin帶你飛 專題三 dancing links kuangbin帶你飛 專題四 最短路練習 kuangbin帶你飛 專題五 並查集 kuangbin帶你飛 專題六 最小生成樹 kuangbin帶你飛 專題...

kuangbin專題一 簡單搜尋

poj 1426 找出乙個由1和0組成的十進位制數m滿足m為n的倍數。有兩種做法,一種是bfs從低位數往高位數搜,另一種是用二叉樹陣列的結構存每次的求出來的餘數,當餘數為0時返回下標,然後根據下標求出其對應的數。1.bfs include includeusing namespace std con...

kuangbin專題一簡單搜尋總結

e find the multiple 題意 找乙個能整除n的數m,對m的要求是只有0和1組成。n不超過200,m長度不超過100.思路 很多人都寫了乙個假演算法,就是在unsigned long long 的範圍裡面找就行了,雖然也a了,但博主想在這裡提一下正確的思路。首先用到了同餘定理 即以任意...