DP入门基本问题
个人对简单的dp问题的理解:找是否有重叠问题,明确递推关系,怎么推的(顺序千万不要搞错),找到状态方程,循环时注意边界条件和方程式是否严格成立。
转自:https://www.cnblogs.com/zyx1301691180/p/5727918.html
HDU 2084
有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

已经告诉你了,这是个DP的题目,你能AC吗?
- 刻画一个最优解的结构特征。
- 递归地定义最优解的值。
- 计算最优解的值,通常采用自底向上的方法。
- 利用计算出的信息构造一个最优解。”
我觉得这道题的解题步骤就完全可以用这个来描述:
1.首先,一个最优解的结构特征,即从顶层走到底层,其各个节点的最大数字之和的为最优解。
2.题目中要求走法为自顶向下,且每一步只能走到相邻的节点,那么每个节点只有两种选择,即这个节点的两个子节点;
那么这个节点的最优解就等于这个节点的值加上其两个节点的最优解的最大值;
3.自底向上的求解。
4.我们所求出来的解就是我们所需要的答案,则第四步在这里可以忽略掉。
最后附上我的代码:
我用数组a来接收数塔的值,则第三部可以表示为:a[i][j]的最优解=max(a[i+1][j]的最优解,a[i+1][j+1]的最优解);
而数塔最底层节点的最优解就等于他本身的值,因为他只有一个;那么最底层的值已知,我们只需要从下往上递推就可以了
即这三行代码块:
for(i=n-1;i>=0;i--)
for(j=0;j<=i;j++)
a[i][j]=a[i][j]+max(a[i+1][j],a[i+1][j+1]);
#include <bits/stdc++.h>
using namespace std ;
int main ()
{
long long dp[][];
int T; cin>>T;
while (T--)
{
int n; cin>>n;
memset(dp,,sizeof(dp));
for(int i=; i<n; i++)
for(int j=; j<=i; j++)
cin>>dp[i][j]; for(int i=n-; i>=; i--)
for(int j=; j<=i; j++)
dp[i][j]+=max(dp[i+][j],dp[i+][j+]); cout<<dp[][]<<endl ;
}
return ;
}
//用滚动数组优化一下
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std; int n;
const int INF=0x3f3f3f3f;
const int maxn=;
int Map[maxn][maxn], f[maxn]; int main()
{
//freopen("in.txt", "r", stdin);
cin>>n;
for(int i=; i<=n; i++)
for(int j=; j<=i; j++)
cin>>Map[i][j]; int ans=-INF;
for(int i=; i<=n; i++)
for(int j=i; j>; j--)
{
f[j]=max(f[j], f[j-])+Map[i][j];
if(i==n)
ans=max(ans, f[j]);
} cout<<ans<<endl;
return ;
}
很相似的一道题目,但搞了好久。
请保证Chair消灭最多敌人并且冲出包围圈。假设Chair在左上角,达到右下角时算突围成功。
值得注意的是,Chair是如此英勇,应当一往无前,也就是说只能向下或向右走。
图示应为最大战果——于是你应该输出他们的和:35
#include <bits/stdc++.h>
using namespace std ;
int main ()
{
long long dp[][];
//int T; cin>>T;
//while (T--)
{
int n; cin>>n;
memset(dp,,sizeof(dp));
for(int i=; i<n; i++)
for(int j=; j<n; j++)
cin>>dp[i][j];
/*
for(int i=n-1; i>=0; i--)
for(int j=0; j<n; j++)
dp[i][j]+=max(dp[i+1][j],dp[i][j+1]);
*/ //错解,重叠子结构顺序弄反了; for(int i=n-; i>=; i--)
for(int j=n-; j>=; j--)
dp[i][j]+=max(dp[i+][j],dp[i][j+]); /*
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
cout<<dp[i][j]<<" ";
cout<<endl;
}
*/
cout<<dp[][]<<endl; }
return ;
}
今天又遇到一个很相似的题目,a了好久,发现自己跟个智障一样。
DP入门基本问题的更多相关文章
- poj 3254 状压dp入门题
1.poj 3254 Corn Fields 状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...
- xbz分组题B 吉利数字 数位dp入门
B吉利数字时限:1s [题目描述]算卦大湿biboyouyun最近得出一个神奇的结论,如果一个数字,它的各个数位相加能够被10整除,则称它为吉利数.现在叫你计算某个区间内有多少个吉利数字. [输入]第 ...
- 【dp入门题】【跟着14练dp吧...囧】
A HDU_2048 数塔 dp入门题——数塔问题:求路径的最大和: 状态方程: dp[i][j] = max(dp[i+1][j], dp[i+1][j+1])+a[i][j];dp[n][j] = ...
- 数位dp入门 hdu2089 不要62
数位dp入门 hdu2089 不要62 题意: 给定一个区间[n,m] (0< n ≤ m<1000000),找出不含4和'62'的数的个数 (ps:开始以为直接暴力可以..貌似可以,但是 ...
- POJ 2342 树形DP入门题
有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...
- hdu3555 Bomb 数位DP入门
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 简单的数位DP入门题目 思路和hdu2089基本一样 直接贴代码了,代码里有详细的注释 代码: ...
- 【专章】dp入门
动态规划(简称dp),可以说是各种程序设计中遇到的第一个坎吧,这篇博文是我对dp的一点点理解,希望可以帮助更多人dp入门. ***实践是检验真理的唯一标准,看再多文章不如自己动手做几道!!!*** 先 ...
- HDU 2084 数塔(简单DP入门)
数塔 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- 树形dp 入门
今天学了树形dp,发现树形dp就是入门难一些,于是好心的我便立志要发一篇树形dp入门的博客了. 树形dp的概念什么的,相信大家都已经明白,这里就不再多说.直接上例题. 一.常规树形DP P1352 没 ...
随机推荐
- ElasticSearch(二)CentOs6.4下安装ElasticSearch
一.准备工作 Elastic 需要 Java 8 环境.如果你的机器还没安装 Java,先需要安装java环境,同时还注意要保证环境变量JAVA_HOME正确设置. 链接:https://pan.ba ...
- Golang命令行拷贝文件
package main import ( "fmt" "io" "os" ) func main() { list := os.Args ...
- PyCharm 设置护眼背景色
PyCharm 设置护眼背景色 一.方法 File -> Seting -> Editor -> Color Scheme -> General -> Text -> ...
- shell实现每天0点备份mysql数据库
就两个文件, 本人学识尚浅,不解释,怕大佬喷. back.sh #/bin/bash MYSQLUSER=root MYSQLPWD=lizhenghua DATABASES=zskdb MYSQLD ...
- NOIP 车站分级 (luogu 1983 & codevs 3294 & vijos 1851) - 拓扑排序 - bitset
描述 一条单向的铁路线上,依次有编号为 1, 2, ..., n 的 n 个火车站.每个火车站都有一个级别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车 ...
- centos7 挂载磁盘设置开机自启动
1.首先查看系统磁盘情况: 2.格式化自己想要挂载的磁盘类型(ext3 ext4现在主要使用的是这些) 3.查看自己格式化磁盘的uuid(使用UUID挂载是唯一标识安全) 4.复制UUID号(别复制双 ...
- Python3 tkinter基础 Canvas background 创建白色的画布 create_line width 画宽的线
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- 4698: Sdoi2008 Sandy的卡片
前言 总之这个东西说起来很麻烦就是了, 思路 差分合并+后缀数组+二分(dddl) 类似于那个bzoj1031的复制子串和那个poj1743的差分 来看个例子 3 5 1 2 3 4 5 4 1 1 ...
- luogu1387 最大正方形
P1387 最大正方形 正方形O(n) 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n, ...
- How Flyway works
The easiest scenario is when you point Flyway to an empty database. It will try to locate its schema ...