[kuangbin带你飞]之'基础DP1'
专题十二 基础DP1
√ HDU 1024 Max Sum Plus Plus
√ HDU 1029 Ignatius and the Princess IV
√ HDU 1069 Monkey and Banana
√ HDU 1074 Doing Homework
√ HDU 1087 Super Jumping! Jumping! Jumping!
√ HDU 1114 Piggy-Bank
√ HDU 1176 免费馅饼
√ HDU 1260 Tickets
√ HDU 1257 最少拦截系统
√ HDU 1160 FatMouse's Speed
POJ 1015 Jury Compromise
√ POJ 1458 Common Subsequence
√ POJ 1661 Help Jimmy
√ POJ 2533 Longest Ordered Subsequence
POJ 3186 Treats for the Cows
√ HDU 1078 FatMouse and Cheese
HDU 2859 Phalanx
POJ 3616 Milking Time
POJ 3666 Making the Grade
// hdu 1024 滚动数组(最大M字串和)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 * @Promlem: 3 * @Time Limit: ms 4 * @Memory Limit: k 5 * @Author: pupil-XJ 6 * @Date: 2019-11-17 15:56:01 7 * @LastEditTime: 2019-11-17 16:55:30 8 */ 9 #include<cstdio> 10 #include<algorithm> 11 #define INF 0x3f3f3f3f 12 using namespace std; 13 const int MAXN = 1000002; 14 15 int main() { 16 int n, m; 17 int maxn; 18 int a[MAXN], dp[MAXN]; 19 int preMAX[MAXN]; 20 while(scanf("%d%d", &m, &n) == 2) { 21 for(int i = 1; i <= n; ++i) { 22 scanf("%d", &a[i]); 23 dp[i] = preMAX[i] = 0; 24 } 25 dp[0] = preMAX[0] = 0; 26 for(int i = 1; i <= m; ++i) { 27 maxn = -INF; 28 for(int j = i; j <= n; ++j) { 29 dp[j] = max(dp[j-1] + a[j], preMAX[j-1] + a[j]); 30 preMAX[j-1] = maxn; 31 maxn = max(maxn, dp[j]); 32 } 33 } 34 printf("%d\n", maxn); 35 } 36 return 0; 37 }
// hdu 1029
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 6 int arr[1000000]; 7 8 int main() 9 { 10 int n; 11 while(cin >> n){ 12 for(int i = 0; i != n; ++i){ 13 scanf("%d", &arr[i]); 14 } 15 sort(arr, arr+n); 16 cout << arr[(n+1)/2] << endl; 17 } 18 return 0; 19 }
// hdu 1069
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 * @Promlem: 3 * @Time Limit: ms 4 * @Memory Limit: k 5 * @Author: pupil-XJ 6 * @Date: 2019-11-21 17:35:43 7 * @LastEditTime: 2019-11-21 18:39:37 8 */ 9 #include<cstdio> 10 #include<algorithm> 11 using namespace std; 12 const int INF = 0x3f3f3f3f; 13 const int MAXN = 105; 14 15 int num; 16 struct node { 17 int x, y, z; 18 } a[MAXN]; 19 20 int n, ans; 21 int dp[MAXN]; 22 23 void SWAP(int &a, int &b, int &c) { 24 if(a > b) swap(a, b); 25 if(b > c) swap(b, c); 26 if(a > b) swap(a, b); 27 } 28 29 bool cmp(const node a, const node b) { 30 return a.x < b.x; 31 } 32 33 int main() { 34 int qaq = 0; 35 while(scanf("%d", &n) == 1 && n) { 36 num = 0; 37 ans = -INF; 38 int x, y, z; 39 for(int i = 0; i != n; ++i) { 40 scanf("%d%d%d", &x, &y, &z); 41 SWAP(x, y, z); 42 ++num; a[num].x = x; a[num].y = y; a[num].z = z; 43 ++num; a[num].x = x; a[num].y = z; a[num].z = y; 44 ++num; a[num].x = y; a[num].y = z; a[num].z = x; 45 } 46 sort(a+1, a+1+num, cmp); 47 for(int i = 1; i <= num; ++i) dp[i] = a[i].z; 48 for(int i = 1; i <= num; ++i) { 49 for(int j = 1; j < i; ++j) { 50 if(a[i].x > a[j].x && a[i].y > a[j].y && dp[i] < dp[j] + a[i].z) { 51 dp[i] = dp[j] + a[i].z; 52 } 53 } 54 ans = max(ans, dp[i]); 55 } 56 printf("Case %d: maximum height = %d\n", ++qaq, ans); 57 } 58 return 0; 59 }
// hdu 1074 状压DP
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define INF 0x3f3f3f3f 5 using namespace std; 6 const int MAXN = (1<<15)+5; 7 8 struct node { 9 char name[105]; 10 int limit, actual; 11 } a[20]; 12 13 int n; 14 int dp[MAXN], time[MAXN], cur[MAXN]; 15 16 void Output(int x) { 17 if(!x) return ; 18 Output(x - (1<<cur[x])); 19 printf("%s\n", a[cur[x]].name); 20 } 21 22 int main() { 23 int QAQ; 24 scanf("%d", &QAQ); 25 while(QAQ--) { 26 memset(time, 0, sizeof(time)); 27 scanf("%d", &n); 28 for(int i = 0; i != n; ++i) scanf("%s%d%d", &a[i].name, &a[i].limit, &a[i].actual); 29 int tot = 1<<n; 30 for(int i = 1; i != tot; ++i) { 31 dp[i] = INF; 32 for(int j = n-1; j >= 0; --j) { 33 int t = 1 << j; 34 if(!(t&i)) continue; 35 int score = time[i-t] + a[j].actual - a[j].limit; 36 if(score < 0) score = 0; 37 if(dp[i] > dp[i-t] + score) { 38 dp[i] = dp[i-t] + score; 39 time[i] = time[i-t] + a[j].actual; 40 cur[i] = j; 41 } 42 } 43 } 44 printf("%d\n", dp[tot-1]); 45 Output(tot-1); 46 } 47 return 0; 48 }
// hdu 1087
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 5 int n; 6 int arr[1005], dp[1005]; 7 int p; 8 9 bool read_input() { 10 if(scanf("%d", &n) == 1 && !n) return false; 11 for(int i = 0; i != n; ++i) { 12 scanf("%d", &arr[i]); 13 dp[i] = arr[i]; 14 } 15 return true; 16 } 17 18 int main() { 19 while(read_input()) { 20 for(int i = 0; i != n; ++i) { 21 for(int j = 0; j != i; ++j) { 22 if(arr[j] < arr[i]) dp[i] = max(dp[i], dp[j]+arr[i]); 23 } 24 } 25 int ans = 0; 26 for(int i = 0; i != n; ++i) { 27 ans = max(dp[i], ans); 28 } 29 printf("%d\n", ans); 30 } 31 return 0; 32 }
// hdu 1114
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 * @Promlem: 3 * @Time Limit: ms 4 * @Memory Limit: k 5 * @Author: pupil-XJ 6 * @Date: 2019-11-22 21:09:55 7 * @LastEditTime: 2019-11-23 12:51:25 8 */ 9 #include<cstdio> 10 #include<algorithm> 11 #define INF 0x3f3f3f3f 12 using namespace std; 13 const int MAXN = 500+5; 14 15 int E, F, t; 16 int n; 17 int w[MAXN], v[MAXN]; 18 int dp[10005]; 19 20 int main() { 21 int QAQ; 22 scanf("%d", &QAQ); 23 while(QAQ--) { 24 scanf("%d%d", &E, &F); 25 t = F - E; 26 for(int i = 0; i <= t; ++i) dp[i] = INF; 27 dp[0] = 0; 28 scanf("%d", &n); 29 for(int i = 1; i <= n; ++i) scanf("%d%d", &v[i], &w[i]); 30 for(int i = 1; i <= n; ++i) { 31 for(int j = w[i]; j <= t; ++j) { 32 dp[j] = min(dp[j], dp[j-w[i]] + v[i]); 33 } 34 } 35 if(dp[t] == INF) printf("This is impossible.\n"); 36 else printf("The minimum amount of money in the piggy-bank is %d.\n", dp[t]); 37 } 38 return 0; 39 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 * @Promlem: 3 * @Time Limit: ms 4 * @Memory Limit: k 5 * @Author: pupil-XJ 6 * @Date: 2019-11-16 20:48:34 7 * @LastEditTime: 2019-11-17 11:18:50 8 */ 9 #include<cstdio> 10 #include<cstring> 11 #include<algorithm> 12 using namespace std; 13 const int MAXN = 100005; 14 15 int n; 16 int dp[MAXN][15]; 17 18 int main() { 19 while(scanf("%d", &n) == 1 && n) { 20 int x, t, T = 0; 21 memset(dp, 0, sizeof(dp)); 22 while(n--) { 23 scanf("%d%d", &x, &t); 24 T = max(T, t); 25 ++dp[t][++x]; 26 } 27 for(int i = T-1; i >= 0; --i) { 28 for(int j = 1; j <= 11; ++j) { 29 dp[i][j] += max(dp[i+1][j-1], max(dp[i+1][j], dp[i+1][j+1])); 30 } 31 } 32 printf("%d\n", dp[0][6]); 33 } 34 return 0; 35 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int MAXN = 2000+5; 5 6 int n; 7 int a[MAXN], b[MAXN]; 8 int dp[MAXN]; 9 10 int main() { 11 int QAQ; 12 scanf("%d", &QAQ); 13 while(QAQ--) { 14 scanf("%d", &n); 15 for(int i = 1; i <= n; ++i) scanf("%d", &a[i]); 16 for(int i = 1; i <= n-1; ++i) scanf("%d", &b[i]); 17 dp[1] = a[1]; 18 for(int i = 2; i <= n; ++i) dp[i] = min(dp[i-1]+a[i], dp[i-2]+b[i-1]); 19 int sum = dp[n]; 20 int h = sum/3600; 21 sum -= h*3600; 22 h += 8; 23 int m = sum/60; 24 sum -= m*60; 25 int s = sum; 26 if(h <= 12) printf("%02d:%02d:%02d am\n", h, m, s); 27 else printf("%02d:%02d:%02d pm\n", h-12, m, s); 28 } 29 return 0; 30 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int MAXN = 1000000; 5 6 int n; 7 int a[MAXN]; 8 int dp[MAXN]; 9 10 int solve() { 11 int ans = 1; 12 for(int i = 1; i <= n; ++i) { 13 dp[i] = 1; 14 for(int j = 1; j < i; ++j) { 15 if(a[j] < a[i] && dp[j] + 1 > dp[i]) { 16 dp[i] = dp[j] + 1; 17 } 18 } 19 ans = max(ans, dp[i]); 20 } 21 return ans; 22 } 23 24 int main() { 25 while(scanf("%d", &n) == 1) { 26 for(int i = 1; i <= n; ++i) scanf("%d", &a[i]); 27 printf("%d\n", solve()); 28 } 29 return 0; 30 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<algorithm> 3 #include<map> 4 using namespace std; 5 typedef pair<int,int> Pair; 6 const int MAXN = 10002+5; 7 8 int n; 9 struct node { 10 int w, s; 11 } a[MAXN]; 12 int cnt; 13 map<Pair, int> id; 14 15 int ans, t; 16 int dp[MAXN]; 17 int pre[MAXN]; 18 19 bool cmp(const node a, const node b) { 20 return a.w > b.w; 21 } 22 23 int main() { 24 int w, s; 25 while(scanf("%d%d", &w, &s) == 2) { 26 ++n; 27 a[n].w = w; a[n].s = s; 28 id[make_pair(w, s)] = ++cnt; 29 dp[n] = 1; pre[n] = 0; 30 } 31 sort(a+1, a+1+n, cmp); 32 ans = 0; t = 1; 33 for(int i = 1; i <= n; ++i) { 34 for(int j = 1; j < i; ++j) { 35 if(a[i].w < a[j].w && a[i].s > a[j].s && dp[j] + 1 > dp[i]) { 36 dp[i] = dp[j] + 1; 37 pre[i] = j; 38 } 39 } 40 if(dp[i] > ans) { 41 ans = dp[i]; 42 t = i; 43 } 44 } 45 printf("%d\n", ans); 46 for(int i = t; i != 0; i = pre[i]) printf("%d\n", id[make_pair(a[i].w, a[i].s)]); 47 return 0; 48 }
// hdu 1015
// hdu 1458 最大公共子序列
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 * @Promlem: 3 * @Time Limit: ms 4 * @Memory Limit: k 5 * @Author: pupil-XJ 6 * @Date: 2019-11-23 17:58:42 7 * @LastEditTime: 2019-11-23 18:12:52 8 */ 9 #include<cstdio> 10 #include<cstring> 11 #include<algorithm> 12 using namespace std; 13 14 int len1, len2; 15 char a[1002], b[1002]; 16 int dp[1002][1002]; 17 18 int main() { 19 while(scanf("%s", a) == 1) { 20 scanf("%s", b); 21 len1 = strlen(a); 22 len2 = strlen(b); 23 memset(dp, 0, sizeof(dp)); 24 25 for(int i = 1; i <= len1; ++i) { 26 for(int j = 1; j <= len2; ++j) { 27 if(a[i-1] == b[j-1]) dp[i][j] = dp[i-1][j-1] + 1; 28 else dp[i][j] = max(dp[i-1][j], dp[i][j-1]); 29 } 30 } 31 printf("%d\n", dp[len1][len2]); 32 } 33 return 0; 34 }
// poj 1661
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 * @Promlem: 3 * @Time Limit: ms 4 * @Memory Limit: k 5 * @Author: pupil-XJ 6 * @Date: 2019-11-23 18:23:35 7 * @LastEditTime: 2019-11-24 00:16:57 8 */ 9 #include<cstdio> 10 #include<cstring> 11 #include<algorithm> 12 #define INF 0x3f3f3f3f 13 using namespace std; 14 const int MAXN = 1002+5; 15 16 struct node { 17 int l, r, h; 18 } edge[MAXN]; 19 20 bool cmp(const node a, const node b) { 21 return a.h > b.h; 22 } 23 24 int n, X, Y, MAX; 25 bool go[MAXN][MAXN][3]; 26 int dp[MAXN][3]; 27 28 void input() { 29 scanf("%d%d%d%d", &n, &X, &Y, &MAX); 30 for(int i = 1; i <= n; ++i) { 31 scanf("%d%d%d", &edge[i].l, &edge[i].r, &edge[i].h); 32 } 33 edge[0].l = edge[0].r = X; 34 edge[0].h = Y; 35 ++n; 36 edge[n].l = -INF; edge[n].r = INF; 37 edge[n].h = 0; 38 } 39 40 void init() { 41 memset(go, false, sizeof(go)); 42 sort(edge, edge+n, cmp); 43 for(int i = 0; i <= n; ++i) { 44 for(int j = i+1; j <= n; ++j) { 45 if(edge[i].h - edge[j].h > MAX) break; 46 bool flag1 = true, flag2 = true; 47 for(int k = i+1; k < j; ++k) { 48 if(go[i][k][1]) { 49 flag1 = false; 50 break; 51 } 52 } 53 for(int k = i+1; k < j; ++k) { 54 if(go[i][k][2]) { 55 flag2 = false; 56 break; 57 } 58 } 59 if(flag1 && edge[i].l >= edge[j].l && edge[i].l <= edge[j].r) go[i][j][1] = true; 60 if(flag2 && edge[i].r >= edge[j].l && edge[i].r <= edge[j].r) go[i][j][2] = true; 61 } 62 } 63 } 64 65 int main() { 66 int QAQ; 67 scanf("%d", &QAQ); 68 while(QAQ--) { 69 input(); 70 init(); 71 memset(dp, INF, sizeof(dp)); 72 dp[0][1] = dp[0][2] = 0; 73 for(int i = 1; i < n; ++i) { 74 for(int j = 0; j < i; ++j) { 75 int h = edge[j].h-edge[i].h; 76 if(go[j][i][1]) { 77 dp[i][1] = min(dp[i][1], dp[j][1]+h+edge[j].l-edge[i].l); 78 dp[i][2] = min(dp[i][2], dp[j][1]+h+edge[i].r-edge[j].l); 79 } 80 if(go[j][i][2]) { 81 dp[i][1] = min(dp[i][1], dp[j][2]+h+edge[j].r-edge[i].l); 82 dp[i][2] = min(dp[i][2], dp[j][2]+h+edge[i].r-edge[j].r); 83 } 84 } 85 } 86 int ans = INF; 87 for(int i = 0; i < n; ++i) { 88 if(go[i][n][1]) ans = min(ans, dp[i][1]+edge[i].h); 89 if(go[i][n][2]) ans = min(ans, dp[i][2]+edge[i].h); 90 } 91 printf("%d\n", ans); 92 } 93 return 0; 94 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 * @Promlem: 3 * @Time Limit: ms 4 * @Memory Limit: k 5 * @Author: pupil-XJ 6 * @Date: 2019-11-24 00:22:24 7 * @LastEditTime: 2019-11-24 00:30:11 8 */ 9 #include<cstdio> 10 #include<cstring> 11 #include<algorithm> 12 using namespace std; 13 const int INF = 0x3f3f3f3f; 14 const int MAXN = 1002+5; 15 16 int n, ans; 17 int a[MAXN]; 18 int dp[MAXN]; 19 20 int main() { 21 while(scanf("%d", &n) == 1) { 22 for(int i = 1; i <= n; ++i) scanf("%d", &a[i]), dp[i] = 1; 23 ans = 1; 24 for(int i = 1; i <= n; ++i) { 25 for(int j = 1; j < i; ++j) { 26 if(a[i] > a[j] && dp[j] + 1 > dp[i]) { 27 dp[i] = dp[j] + 1; 28 } 29 } 30 ans = max(ans, dp[i]); 31 } 32 printf("%d\n", ans); 33 } 34 return 0; 35 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 7 const int dx[] = {-1, 1, 0, 0}; 8 const int dy[] = { 0, 0,-1, 1}; 9 10 int n, k; 11 int G[1005][1005]; 12 int dp[1005][1005]; 13 14 int dfs(int x, int y) { 15 if(dp[x][y]) return dp[x][y]; 16 int ans = 0; 17 for(int i = 0; i != 4; ++i) { 18 for(int j = 1; j <= k; ++j) { 19 int nx = x+dx[i]*j; 20 int ny = y+dy[i]*j; 21 if(nx >= 0 && nx < n && ny >= 0 && ny < n && G[x][y] < G[nx][ny]) { 22 ans = max(ans, dfs(nx, ny)); 23 } 24 } 25 } 26 return dp[x][y] = ans + G[x][y]; 27 } 28 29 int main() { 30 while(scanf("%d%d", &n, &k) == 2 && n > 0) { 31 for(int i = 0; i != n; ++i) { 32 for(int j = 0; j != n; ++j) { 33 scanf("%d", &G[i][j]); 34 } 35 } 36 memset(dp, 0, sizeof(dp)); 37 printf("%d\n", dfs(0, 0)); 38 } 39 return 0; 40 }