洛谷 P1854 花店橱窗布置(算法竞赛进阶指南,线性DP)
算法竞赛进阶指南347页,线性DP
题目:
每一排选一个数,求一个最大的和,要求前一排选的数比后一排选的数靠左。
本题要点:
1、状态表示:
dp[i][j] 表示前 i朵花,放入前j个花盆中,获得最大值。
vis[i][j] = true, 如果 dp[i - 1][j - 1] + mp[i][j] > dp[i][j - 1]
2、状态转移
dp[i][j] = max(dp[i][j - 1], dp[i - 1][j - 1] + mp[i][j]);
3、输出方案:
每一行从右往左找,找到第一个 vis[i][j] 为true的,则为第i行选的该数j,再从第i-1一行的j-1向左找,直到找出所有
#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int MaxN = 110; int n, m; int mp[MaxN][MaxN]; int dp[MaxN][MaxN]; bool vis[MaxN][MaxN];//vis[i][j] = true, 如果 dp[i - 1][j - 1] + mp[i][j] > dp[i][j - 1] int ans[MaxN]; void solve() {memset(vis, false, sizeof vis);memset(dp, 0x80, sizeof dp);for(int i = 0; i <= m; ++i)dp[0][i] = 0;for(int i = 1; i <= n; ++i){for(int j = 1; j <= m; ++j){dp[i][j] = max(dp[i][j - 1], dp[i - 1][j - 1] + mp[i][j]);if(dp[i - 1][j - 1] + mp[i][j] > dp[i][j - 1]){vis[i][j] = true;}}}int k = m;for(int i = n; i >= 1; --i){for(; k >= 1; --k){if(vis[i][k]){ans[i] = k--;break;}}}printf("%dn", dp[n][m]);for(int i = 1; i <= n; ++i){printf("%d", ans[i]);if(i < n){printf(" ");}else{printf("n");}} } int main() {scanf("%d%d", &n, &m);for(int i = 1; i <= n; ++i)for(int j = 1; j <= m; ++j)scanf("%d", &mp[i][j]);solve();return 0; } /* 3 5 7 23 -5 -24 16 5 21 -4 10 23 -21 5 -4 -20 20 */ /* 53 2 4 5 */
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374相关知识
[线性dp]花店橱窗 AcWing313
花店橱窗布置(洛谷P1854)(动态规划)
P1854 花店橱窗布置
[动态规划]花店橱窗布置
动态规划 luogu P1854 花店橱窗布置
[Tyvj 1124]花店橱窗布置
【DP】花店橱窗布置
P1854 花店橱窗布置 题解
花店橱窗题目题解
题解 P1854 花店橱窗布置
网址: 洛谷 P1854 花店橱窗布置(算法竞赛进阶指南,线性DP) https://www.huajiangbk.com/newsview548980.html
上一篇: 十大最畅销的家居饰品有哪些 好卖 |
下一篇: 花桥电商集聚再“升温”,助力企业 |
推荐分享

- 1君子兰什么品种最名贵 十大名 4012
- 2世界上最名贵的10种兰花图片 3364
- 3花圈挽联怎么写? 3286
- 4迷信说家里不能放假花 家里摆 1878
- 5香山红叶什么时候红 1493
- 6花的意思,花的解释,花的拼音 1210
- 7教师节送什么花最合适 1167
- 8勿忘我花图片 1103
- 9橄榄枝的象征意义 1093
- 10洛阳的市花 1039