数字三角形 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); }

变式:

数字三角形 2

bool  f[i][j][k] 走到(i,j),时取模后最大价值为k是否可行

Code 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[][];
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); }

数字三角形 3

你考虑把它转化一下,因为必须经过(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)

Code 3
#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); }

数字三角形 4

这个就是推广了一下上一个题

其实只有下面框下来的这些点有用,其余没用的清理成0就好

Code 4
#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----鬼畜的数字三角形的更多相关文章

  1. dp递推 数字三角形,dp初学者概念总结

    数字三角形(POJ1163)          在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或 右下走.只需要求出这个最大和即可,不必给出 ...

  2. 4829 [DP]数字三角形升级版

    4829 [DP]数字三角形升级版  时间限制: 1 s  空间限制: 16000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 从数字三角形的顶部(如图, ...

  3. HDU 1176 免费馅饼 (类似数字三角形的题,很经典,值得仔细理解的dp思维)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1176 免费馅饼 Time Limit: 2000/1000 MS (Java/Others)     ...

  4. C++数字三角形问题与dp算法

    题目:数字三角形 题目介绍:如图所示的数字三角形,要求从最上方顶点开始一步一步下到最底层,每一步必须下一层,求出所经过的数字的最大和. 输入:第一行值n,代表n行数值:后面的n行数据代表每一行的数字. ...

  5. 算法训练 数字三角形(DP)

    问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●1<三角形行数≤100: ...

  6. hihoCoder#1037 : 数字三角形(DP)

    [题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 问题描写叙述 小Hi和小Ho在经历了螃蟹先生的任务之后被奖励了一次出国旅游的机会,于是他 ...

  7. codevs——1220 数字三角形(棋盘DP)

     时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 如图所示的数字三角形,从顶部出发,在每一结点可以选择向左走或 ...

  8. Codevs 4829 [DP]数字三角形升级版

    4829 [DP]数字三角形升级版 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 从数字三角形的顶部(如图,第一行的5表示行数)到底 ...

  9. 数字三角形 (DP入门)

    7 3     8 8     1     0 2     7     4     4  4     5     2     6     5 给出一个数字三角形.从三角形的顶部到底部有很多条不同的路径 ...

  10. 【线性DP】数字三角形

    题目链接 原题链接 题目描述 给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大. 7 3 ...

随机推荐

  1. Dreamweaver CS6 破解安装

    安装 双击Dreamweaver.dmg文件,然后Command+N,新建一个Finder,接着将Adobe Dreamweaver CS6拖到新建Finder的应用程序中.   在Finder中应用 ...

  2. Windows defender怎么才能彻底关闭?

    据不久前的一项测试表明,Windows系统自带的Windows defender软件在所有参与测试的杀毒安全软件中对win10的运行速度影响最大. 而Win10系统的Windows defender会 ...

  3. Swift 函数式数据结构 - 链表

    本文将使用Swift实现一个标准链表,在实现的过程中,遵守函数式编程的规则,无副作用,可以看到和C语言的实现还是有较大的差异. 预备知识 enum 的各种用法 swift的基本的模式匹配( patte ...

  4. 【转】Qt 资源图片删除后,错误 needed by `debug/qrc_image.cpp'. Stop. 的终极解决办法

    @2019-06-13 [小记] Qt项目做完了把资源文件夹下已经不用的图片文件删掉,运行时报错(编译不报错):No rule to make target `images/图片文件名', neede ...

  5. 9.0.网络编程_IO 通信模型

    5. IO 通信模型 网络通信的本质是网络间的数据 IO.只要有 IO,就会有阻塞或非阻塞的问题,无论这个 IO 是网络的,还是硬盘的.原因在于程序是运行在系统之上的, 任何形式的 IO 操作发起都需 ...

  6. java线程基础巩固---Daemon线程的创建以及使用场景分析

    daemon线程既守护线程,而在jdk中对于Thread中针对守护线程有专门的API,如下: 而之前在公司项目中就看到过有人使用过Thread中的这个API,但是对于它的使用场景完全不知,所以这次好好 ...

  7. ABC007D Small Multiple[最短路]

    题意:求$K$的倍数中数位和的最小值. 一开始有一种思路:由于产生答案的数字可能非常大,不便枚举,考虑转化为构造一个数字可以有$x\mod k=0$.然后二分答案数位和,数位DP检验是否存在,但是由于 ...

  8. springcloud实践(一)服务发现:Eureka

    Eureka 入门 是什么? Eureka 是 Netflix 开源的一个 RESTful服务,主要用于服务注册与发现. 它由Eureka server 和Eureka client组成. Eurek ...

  9. PHP swoole UDP服务端和客户端

    服务端 <?php $serv = ,SWOOLE_PROCESS,SWOOLE_SOCK_UDP); $serv->on('Packet',function ($serv,$data,$ ...

  10. centos7编译安装php7.3

    处理问题   解决php configure: error: Cannot find ldap libraries in /usr/lib.错误 cp -frp /usr/lib64/libldap* ...