数字三角形 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. 用Nginx为多个http/socks代理做负载均衡(反向代理)

    近日遇到一个需求,某机器上在四个端口上开了四个http代理,因为每个代理都有流量限额,所以要平均着使用,但由使用者手动更改端口号又太麻烦,所以需要将这4个端口融合为1个,想到的办法就是用Nginx做负 ...

  2. NB-IOT无线帧结构和下行物理信道

    NB-IOT Downlink OFDM参数 1.下行基于OFDMA, FF点数=128,基带采样速率1.92MHz,子载波间距15kHz,有效带宽180kHz=1PRB OFDMA: 正交频分多址, ...

  3. “联邦对抗技术大赛”9月开战 微众银行呼唤开发者共同“AI创新”

    “联邦对抗技术大赛”9月开战  微众银行呼唤开发者共同“AI创新”   从<第五元素>中的智能系统到<超体>中的信息操控,在科幻电影中人工智能已经发展到了极致.而在现实中,目前 ...

  4. 使用HTML5 -Canvas追踪用户,Chrome隐身模式阵亡

    中国的一些精准营销公司又要偷着乐了= =从之前追踪Cookie到后面追踪FlashCookie,某些商家总在永无止境的追踪用户行为甚至是隐私,将其转化为所谓的“商业价值”.我们被迫面临“世风日下.道德 ...

  5. z-index无效失效的解决

    解决办法: 父级元素加上position:relative;并设置z-index父级元素的z-index优先,其中包含的元素的z-index是相对于父级元素的index <div style=& ...

  6. Python的在线编辑环境

    另外,再提供几个Python的在线编辑环境,可以直接写代码并且运行的环境. 在线Python实验室:http://www.pythoner.cn/labs/ 在线Python编辑器:http://ww ...

  7. html2canvas-html图片合成-canvas生成图片

    作用 html2canvas可以通过纯JS对浏览器端经行截屏,但截图的精确度还有待提高,部分css不可识别,所以在canvas中不能完美呈现原画面样式 支持的浏览器 Firefox 3.5+ Goog ...

  8. [CSS] .class1.class2和.class1 .class2的区别

    .class1.class2(中间没有空格)匹配的是同时拥有class1和class2的元素 <div class="class1 class2">...</di ...

  9. 【算法学习笔记】RMQ问题与ST表

    \(0.\) RMQ问题 P1816 人话翻译 给定一个长度为\(n\)的数列\(a\),然后有\(m\)组询问,每次询问一个区间\([l,r]\)的最小值. 其中\(m,n\leq10^5\) \( ...

  10. 04 vue-cli 脚手架、webpack-simple模板项目生成、组件使用

    alice https://www.cnblogs.com/alice-bj/p/9317504.html https://www.cnblogs.com/alice-bj/p/9318069.htm ...