数字三角形 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. 如何使windows7的默认共享可以被访问[转载]

        因为UAC的存在, 如果使用windows 7 的默认共享,比如 \abcc$ ,会被提示 无权限错误. 为了方便在局域网共享文件,找到了这个方法. Open the registry edi ...

  2. MacOs上的Intellij idea高频快捷键总结(2018.1版本)

     高频快捷键   查找类快捷键           command + F12      查看当前类方法变量           command + E         查看最近文件   Alt+F1 ...

  3. Python lambda 知识点

    作者说学会了lambda后,你会用上瘾的,因为让代码复用和简洁. 初识lamdba不太好理解,尤其是它能当着一个变量传递给函数,不过多学着写几个例子就好了,下面是我的学习笔记. lambda 操作符( ...

  4. manjaro 基本系统配置

    1.更新源 vim /etc/pacman.conf [archlinuxcn] SigLevel = Never Server = http://mirrors.tuna.tsinghua.edu. ...

  5. PAT Basic 1044 火星数字 (20 分)

    火星人是以 进制计数的: 地球人的 被火星人称为 tret. 地球人数字 到 的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov ...

  6. php将数组中某个元素置顶设为第一个元素

    一个数组$a0有N个元素,要将其中第3个元素,排在数组的首位. 第一种做法是: 取出第3个元素,赋值给变量$a unset 第3个元素 array_unshift 将$a添加到数组头部. 如果是数字下 ...

  7. Legendre公式和Kummer定理

    Legendre公式 对于质数\(p\),函数\(v_p(n)\)为\(n\)标准分解后\(p\)的次数 显然有 \[v_p(n!) = \sum\limits_{i = 1}^{\infty} \l ...

  8. White-Label Apps

    转载:https://www.vendasta.com/blog/white-label-apps What are white-label apps? White-label apps are ap ...

  9. 8张图,让你彻底理解三极管的开关功能 && 經典線路圖

    三极管除了可以当作交流信号放大器之外,也可以作为开关之用.严格说起来,三极管与一般的机械接点式开关在动作上并不完全相同,但是它却具有一些机械式开关所没有的特点. 为了很好的理解三极管的开关功能,下面以 ...

  10. Hadoop-No.12之数据采集的时效性

    数据采集的时效性,指的是可进行数据采集的时间与Hadoop中工具可访问数量的时间之间的间隔.采集架构的时间分类会对存储媒介和采集方法造成很大的影响. 一般来说,在设计应用的采集构架之前建议使用以下分类 ...