DP----鬼畜的数字三角形
数字三角形 1
洛谷 P1216 数字金字塔
我们可以用 f [ i ] [ j ] 表示从(1,1)出发,到达(i,j)的最大权值和。
(i , j)可以由 正上(i - 1 , j)或者 左上(i - 1 , j - 1)转化来,所以要求这二者的最大值。
转移方程为:
f [ i ] [ j ] = max ( f [ i - 1 ] [ j ] , f [ i - 1 ] [ j - 1 ] ) + a [ i ] [ j ] ;
边界为f [ 1 ] [ 1 ] = a [ 1 ] [ 1 ] ; (其实不加也没关系)
Code 1
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdlib> using namespace std; inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} int n;
int f[][],a[][]; int main()
{
n=read();
for(int i=;i<=n;i++)
for(int j=;j<=i;j++)
a[i][j]=read();
for(int i=;i<=n;i++)
for(int j=;j<=i;j++)
f[i][j]=max(f[i-][j-],f[i-][j])+a[i][j]; int ans=;
for(int i=;i<=n;i++)
ans=max(ans,f[n][i]); printf("%d",ans); }
变式:
bool f[i][j][k] 走到(i,j),时取模后最大价值为k是否可行
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdlib> using namespace std; inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} const int mod=;
int n,ans;
int a[][];
bool f[][][]; int main()
{
n=read();
for(int i=;i<=n;i++)
for(int j=;j<=i;j++)
{
a[i][j]=read();
f[i][j][a[i][j]%]=true;
} for(int i=;i<=n;i++)
for(int j=;j<=i;j++)
for(int k=;k<;k++)
{
if(f[i-][j-][k]) f[i][j][(k+a[i][j])%mod]=true;
if(f[i-][j][k]) f[i][j][(k+a[i][j])%mod]=true;
} for(int i=;i<=n;i++)
for(int k=;k<;k++)
if(f[n][i][k])
ans=max(ans,k); printf("%d",ans); }
你考虑把它转化一下,因为必须经过(n/2,n/2),很多点都是没用的
以自造数据为例
8
1
2 7
5 6 9
13 27 66 23
17 55 6 8 9
26 77 8 1 3 6
5 7 4 3 6 3 1
6 6 7 8 2 2 3 7
简化

因为其余没用啊,这样做就保证一定经过点(n/2,n/2)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdlib> using namespace std; inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} const int mod=;
int n,ans;
int a[][];
int f[][]; int main()
{
n=read();
for(int i=;i<=n;i++)
for(int j=;j<=i;j++)
a[i][j]=read(); for(int i=;i<=n/;i++)
for(int j=;j<=i-;j++)
a[i][j]=; for(int i=n/+;i<=n;i++)
for(int j=;j<=n/-;j++)
a[i][j]=; for(int i=;i<=n;i++)
for(int j=;j<=i;j++)
f[i][j]=max(f[i-][j-],f[i-][j])+a[i][j];
for(int i=;i<=n;i++)
ans=max(ans,f[n][i]); printf("%d",ans); }
这个就是推广了一下上一个题
其实只有下面框下来的这些点有用,其余没用的清理成0就好

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdlib>
#include<queue> using namespace std; inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} int n,x,y;
int a[][],f[][],ans=; int main()
{
n=read();
for(int i=;i<=n;i++)
for(int j=;j<=i;j++)
a[i][j]=read();
x=read();y=read(); for(int i=y+;i<=x;i++)
for(int j=y+;j<=i;j++)
a[i][j]=; int kk=;
for(int i=x-y+;i<=x;i++)
{
kk++;
for(int j=;j<=kk;j++)
a[i][j]=;
} for(int i=x+;i<=n;i++)
{
for(int j=;j<=y-;j++) a[i][j]=;
for(int j=i-(x-y)+;j<=i;j++) a[i][j]=;
} for(int i=;i<=n;i++)
for(int j=;j<=i;j++)
f[i][j]=max(f[i-][j-],f[i-][j])+a[i][j]; for(int i=;i<=n;i++)
ans=max(ans,f[n][i]); printf("%d",ans); return ;
}
再也不折叠代码了 !
DP----鬼畜的数字三角形的更多相关文章
- dp递推 数字三角形,dp初学者概念总结
数字三角形(POJ1163) 在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或 右下走.只需要求出这个最大和即可,不必给出 ...
- 4829 [DP]数字三角形升级版
4829 [DP]数字三角形升级版 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 从数字三角形的顶部(如图, ...
- HDU 1176 免费馅饼 (类似数字三角形的题,很经典,值得仔细理解的dp思维)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1176 免费馅饼 Time Limit: 2000/1000 MS (Java/Others) ...
- C++数字三角形问题与dp算法
题目:数字三角形 题目介绍:如图所示的数字三角形,要求从最上方顶点开始一步一步下到最底层,每一步必须下一层,求出所经过的数字的最大和. 输入:第一行值n,代表n行数值:后面的n行数据代表每一行的数字. ...
- 算法训练 数字三角形(DP)
问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●1<三角形行数≤100: ...
- hihoCoder#1037 : 数字三角形(DP)
[题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 问题描写叙述 小Hi和小Ho在经历了螃蟹先生的任务之后被奖励了一次出国旅游的机会,于是他 ...
- codevs——1220 数字三角形(棋盘DP)
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 如图所示的数字三角形,从顶部出发,在每一结点可以选择向左走或 ...
- Codevs 4829 [DP]数字三角形升级版
4829 [DP]数字三角形升级版 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 从数字三角形的顶部(如图,第一行的5表示行数)到底 ...
- 数字三角形 (DP入门)
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 给出一个数字三角形.从三角形的顶部到底部有很多条不同的路径 ...
- 【线性DP】数字三角形
题目链接 原题链接 题目描述 给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大. 7 3 ...
随机推荐
- vue下载后台传过来的乱码流的解决办法
后台返回的乱码流 解决办法: 请求方式用的是axios,主要加关键的 {responseType: 'blob'} axios封装 export function postDownload(url, ...
- mybatis报错,There is no getter for property named 'templateName' in 'class
There is no getter for property named 'templateName' in 'class 主要原因是因为mapper.xml 的语句有错误,导致在bean里找不到相 ...
- 错误处理:java.lang.NoClassDefFoundError: javax/jms/JMSContext
原因是少包,需要在pom文件增加依赖 <dependency> <groupId>javax.jms</groupId> <artifactId>jav ...
- 7、TortoiseSVN
7.TortoiseSVN TortoiseSVN图标介绍: 目录空白处右键→TortoiseSVN→Settings 7.1独立将工程上传到服务器的思路 12.2针对archetype-catalo ...
- dhcpd.conf配置文件几例
例1 ddns-update-style interim; ignore client-updates; subnet 192.168.222.0 netmask 255.255.255.0 { ...
- 关于SYSLINUX的一些重要描述摘录
以下资源都来自官方文档,原文摘录 The SYSLINUX suite contains the following boot loaders ("derivatives"), f ...
- DA_04_解决Xshell中文乱码问题
一:解决Xshell中文乱码问题 二:解决克隆后eth0不见的问题 2.1:虚拟机克隆步骤: 1.直接修改 /etc/sysconfig/network-script/i ...
- Docker容器内服务自启
创建容器时需要配置--privileged和容器启动后执行的命令为/sbin/init/. docker run -d -it --name example -p 3308:3306 -p 2080: ...
- Python中的字符串及其相关操作
1.表示: 字符串可以用单引号或者双引号括起来,两者效果是完全一样的. 针对较长的字符串,也可以用三个引号括起来,即"""..."""或者' ...
- 【构造 meet in middle 随机 矩阵树定理】#75. 【UR #6】智商锁
没智商了 变式可见:[构造 思维题]7.12道路建设 当你自信满满地把你认为的正确密码输入后,时光机滴滴报警 —— 密码错误.你摊坐在了地上. 黑衣人满意地拍了拍你的肩膀:“小伙子,不错嘛.虽然没解开 ...