简单递推
来源:互联网 发布:gta4画面优化补丁 编辑:程序博客网 时间:2024/05/18 10:04
题目链接:[点这儿].
题意:
一个菱形地图,每个格子有数字,问你从最上面一个格子走到最下面一个格子经过的数字加起来最大是多少,向下走的时候只能走下面相邻的两个格子.
解析:
简单的递推型动态规划,状态转移方程为:
dpi,j=arri,j+{max(j<arri−1.size?dpi−1,j:0,j−1<0?0:dpi−1,j−1)max(dpi−1,j,dpi−1,j+1)i<ni>=n
这种由上往下递推的动态规划,一般可以用滚动数组来优化内存空间.
代码:
#include <bits/stdc++.h>using namespace std;int main(){ int T, K = 1; for (scanf("%d", &T); T--; K++) { int n, x; scanf("%d", &n); vector<vector<int> > arr(2), dp(2, vector<int>(n)); arr[0].push_back((scanf("%d", &x), x)); dp[0][0] = arr[0][0]; for (int i = 1; i < n; i++) { for (int j = 0; j <= i; j++) arr[i % 2].push_back((scanf("%d", &x), x)); for (int j = 0; j < arr[i % 2].size(); j++) dp[i % 2][j] = arr[i % 2][j] + max(j < arr[(i - 1) % 2].size() ? dp[(i - 1) % 2][j] : 0, j - 1 < 0 ? 0 : dp[(i - 1) % 2][j - 1]); arr[(i - 1) % 2].clear(); } for (int i = n; i < 2 * n - 1; i++) { for (int j = 2 * n - i - 1; j > 0; j--) arr[i % 2].push_back((scanf("%d", &x), x)); for (int j = 0; j < arr[i % 2].size(); j++) dp[i % 2][j] = arr[i % 2][j] + max(dp[(i - 1) % 2][j], dp[(i - 1) % 2][j + 1]); arr[(i - 1) % 2].clear(); } printf("Case %d: %d\n", K, dp[(2 * n - 2) % 2][0]); } return 0;}
阅读全文
0 0
- UVA10943简单递推
- hdu2501 简单递推
- 简单递推
- 简单递推
- 简单递推
- 简单递推
- 简单递推
- UVa 11000 简单递推
- hdu 2046 简单递推
- poj 2081 简单递推
- Flags-Ural1225简单递推
- HDU 2190 简单递推
- POJ1050 简单的递推~
- 简单的递推练习
- 简单的递推练习
- 简单的递推练习
- POJ 2590 Steps(简单数列递推)
- POJ 3299 Humidex(简单公式递推)
- hash
- 微信小程序解决多个视频播放的问题
- list
- Docker思维导图
- 问题 C: 查找学生信息
- 简单递推
- py文件如何加密为pyc文件
- ab压力测试工具简单使用
- set
- 在AWS上配置CodeCommit
- .NET Core 使用RSA算法 加密/解密/签名/验证签名
- 浅析Entity Framework Core中的并发处理
- javascript忍者秘籍
- PCA降维原理 onenote笔记