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了,但博主想在這裡提一下正確的思路。首先用到了同餘定理 即以任意...