DP入门50题(1) ——poj3176 数塔(详细、适合新手)
来源:互联网 发布:那些软件可以赚集分宝 编辑:程序博客网 时间:2024/05/01 15:19
前天开始复习以前的烂摊子——DP,然后到今天,水了十二道题,现在回头边敲边写博客回忆一下。这是第一道题,也是一般ACMer的DP入门第一题吧 ^_^
题意:大家也都知道的,输出从数塔第一层走到最后一层路径的最大值。
思想:直接从底向上回溯就好了,比较直接,没有直接去套背包写的,适合新手看;首先把dp数组memset全为0,然后把数组最后一层a[n-1][i]的值赋给dp最后一层dp[n-1][i],从倒数第二层开始循环,先看这一层:这倒数第二层的每一个数所在DP数组的值是这个数的值加上它下边两个数中较大的那个数的值,也就是dp[n-2][j]=a[n-2][j]+max(dp[n-1][j],dp[n-2][j+1]),这也就推出公式了:
dp[i][j] = a[i][j]+max(dp[i+1][j],dp[i+1][j+1]);
AC代码如下:
#include <iostream>#include <cstdio>#include <cstring>using namespace std;int Max(int a,int b){return a>b?a:b;}int a[500][500],dp[500][500],n;void input(){ for(int i = 0 ; i < n ; i++) for(int j = 0 ; j <= i ; j++) cin >> a[i][j]; memset(dp,0,sizeof(dp)); for(int i = 0 ; i < n ; i++) dp[n-1][i] = a[n-1][i];}void solve(){ for(int i = n-2 ; i >= 0 ; i--) for(int j = 0 ; j <= i ; j++) { dp[i][j] = a[i][j] + Max(dp[i+1][j],dp[i+1][j+1]); } cout << dp[0][0] << endl;}int main(){ #ifdef H_R freopen("in.txt","r",stdin); #endif // H_R cin.tie(false); ios::sync_with_stdio(false); while(cin >> n) { input(); solve(); } return 0;}
0 0
- DP入门50题(1) ——poj3176 数塔(详细、适合新手)
- POJ3176 DP 数塔
- poj3176--Cow Bowling(dp:数塔问题)
- poj3176——Cow Bowling(dp)
- POJ3176——Cow Bowling(水DP)
- 数塔--poj3176
- poj3176 dp
- poj3176(DP)
- POJ3176(DP)
- 1poj3176(dp)记忆化搜索
- ZJUT1507 最优取数 POJ3176 Cow Bowling DP
- linux基础知识及命令大全(1)(适合新手)【详细】
- POJ3176——Cow Bowling
- poj3176——cow bowling
- 【DP入门】数塔
- Mybatis快速入门—新手Mybatis详细配置步骤介绍
- Hibernate快速入门—新手Hibernate详细配置步骤介绍
- poj3176 简单dp
- 梳理各种编码
- Linux netstat命令详解
- ESP8266 Development Kit on Mac Os Yosemite
- ORACLE ORA-01830:日期格式图片在转换整个输入字符串之前结束
- jstl函数库-length函数
- DP入门50题(1) ——poj3176 数塔(详细、适合新手)
- 美语音标 何谓重音
- Softany WinCHM Pro v5 0-LAXiTY
- Objective--C中的NSNumber类
- Webyog SQLyog Ultimate v12 0 8 0 Multilingual Regged-CORE
- SAP自动付款(Automatic payment)
- HDU 1671 && POJ 3630 Phone List (Trie树 好题)
- Hello World!
- 美语音标 [ə]的几点注意