添在前面的一句话:初学DP,若有错误,请指出,不能误人子弟,欢迎大家提出意见.水平不高,博客写的比较粗糙,代码也挺丑,请见谅.

最原始的数字三角形:

1220 数字三角形

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
 
 
 
题目描述 Description

如图所示的数字三角形,从顶部出发,在每一结点可以选择向左走或得向右走,一直走到底层,要求找出一条路径,使路径上的值最大。

输入描述 Input Description

第一行是数塔层数N(1<=N<=100)。

第二行起,按数塔图形,有一个或多个的整数,表示该层节点的值,共有N行。

输出描述 Output Description

输出最大值。

样例输入 Sample Input

5

13

11 8

12 7 26

6 14 15 8

12 7 13 24 11

样例输出 Sample Output

86

数据范围及提示 Data Size & Hint
 

思路:因为f[i][j] 从 f[i + 1][j] 或者 f[i + 1][j + 1] 转移过来,但是我们要的是最大路径长度,所以从max(f[i +1][j],f[i + 1][j + 1])是最优解,所以DP转移方程为f[i][j]  += max(f[i + 1][j],f[i + 1][j + 1]);

代码:

 #include <iostream>
#include <cstdio>
#define X 1007 int f[X][X]; int max(int x,int y){
return x > y ? x : y;
} inline int read(){
int x = ,f = ;char c = getchar();
while(c < '' || c > ''){if(c == '-')f = -;c = getchar();}
while(c >= '' && c <= ''){x = x * + c - '';c = getchar();}
return x * f;
} int main(){
int n;
n = read();
for(int i = ;i <= n;++ i)
for(int j = ;j <= i;++ j)
f[i][j] = read();
for(int i = n - ;i >= ;-- i)
for(int j = ;j <= i;++ j)
f[i][j] += max(f[i + ][j],f[i + ][j + ]);
printf("%d",f[][]);
}

数字三角形w

2189 数字三角形W

 时间限制: 1 s
 空间限制: 32000 KB
 题目等级 : 黄金 Gold
 查看运行结果
 
 
题目描述 Description

数字三角形
要求走到最后mod 100最大

输入描述 Input Description

第1行n,表示n行
第2到n+1行为每个的权值

输出描述 Output Description

mod 100最大值

样例输入 Sample Input

2
1
99 98

样例输出 Sample Output

99

数据范围及提示 Data Size & Hint

n<=25

思路:根据mod 100这个条件,按照上一个题,已经不满足与最优子结构,所以我们要加一维。

可达性DP,我们开一个bool数组 f[i][j][k],f[i][j][k]表示i行,j列,从下面到k值能不能走通,所以我们就想出DP转移方程了,f[i][j][k] = f[i + 1][j][v] | f[i + 1][j + 1][v];(v = (k + 100 - a[i][j] %100) % 100)(ps:这个地方挺重要的,如果k数值 < a[i][j]的话,就会成为负数,然而他是比a[i][j]要大的,所以我们加上一个100也没有关系,建议这个地方好好领悟.先让a[i][j] % 100可以有效的防a[i][j] > k + 100

代码:

 #include <iostream>
#include <cstdio>
#define X 30 int a[X][X];
bool f[X][X][];//f[i][j][k] i 表示 第i行 j表示第j列 k表示上面的路径%100到k这个值 bool型数组,能到k值为1,到不了为0 int max(int x,int y){
return x > y ? x : y;
}//max函数,我没用using namespace std inline int read(){
int x = ,f = ;char c = getchar();
while(c < '' || c > ''){if(c == '-')f = -;c = getchar();}
while(c >= '' && c <= ''){x = x * + c - '';c = getchar();}
return x * f;
}//快读 不解释 int main(){
int n,ans = ;//n 如题 有n层的数字三角形
n = read();
for(int i = ;i <= n;++ i)
for(int j = ;j <= i;++ j)
a[i][j] = read();//读入三角形
for(int i = ;i <= n;++ i)f[n][i][((a[n][i] % ) + ) % ] = true;//在最下面一层,不会有人转移到他
//所以这是初始条件,a[n][i] % 100 这个值会到达,所以标记为true
for(int i = n - ;i >= ;-- i){
for(int j = ;j <= i;++ j){
for(int k = ;k <= ;++ k){
int v = (k - (a[i][j] %) + ) % ;
f[i][j][k] = f[i + ][j][v] | f[i + ][j + ][v];
}
}
}//核心代码,根据条件很容易得到DP转移方程 f[i][j][k] = f[i + 1][j] [(k - a[i][j]) % 100] | f[i + 1][j + 1][(k - a[i][j]) % 100];
for(int i = ;i >= ;-- i)
if(f[][][i]){ans = i;break;}//从后往前推,如果这个到达了这个i值,直接break就好.
printf("%d",ans);
}

数字三角形ww

2193 数字三角形WW

 时间限制: 1 s
 空间限制: 32000 KB
 题目等级 : 钻石 Diamond
 
 
 
题目描述 Description

数字三角形必须经过某一个点,使之走的路程和最大

输入描述 Input Description

第1行n,表示n行
第2到n+1行为每个的权值
程序必须经过n div 2,n div 2这个点

输出描述 Output Description

最大值

样例输入 Sample Input

#include <iostream>
#include <cstdio>
#define X 30 int f[X][X]; inline int read(){
int x = ,f = ;char c = getchar();
while(c < '' || c > ''){if(c == '-')f = -;c = getchar();}
while(c >= '' && c <= ''){x = x * + c - '';c = getchar();}
return x * f;
} int max(int x,int y){
return x > y ? x : y;
} int main(){
int n = read(),x;
for(int i = ;i <= n;++ i)
for(int j = ;j <= i;++ j)
f[i][j] = read();
for(int i = ;i < n / ;++ i)f[n/][i] = -0x3f3f3f3f;
for(int i = n - ;i >= ;-- i){
for(int j = ;j <= i;++ j){
f[i][j] += max(f[i + ][j],f[i + ][j + ]);
}
}
printf("%d",f[][]);
}

2
1
1 1

样例输出 Sample Output

2

数据范围及提示 Data Size & Hint

n <=25

思路:只能走f[n / 2][n / 2]这条路,我们就好在n / 2这一行的除了f[n / 2][n / 2]全部设成最小值就可以了.

代码:

 #include <iostream>
#include <cstdio>
#define X 30 int f[X][X]; inline int read(){
int x = ,f = ;char c = getchar();
while(c < '' || c > ''){if(c == '-')f = -;c = getchar();}
while(c >= '' && c <= ''){x = x * + c - '';c = getchar();}
return x * f;
} int max(int x,int y){
return x > y ? x : y;
} int main(){
int n = read(),x;
for(int i = ;i <= n;++ i)
for(int j = ;j <= i;++ j)
f[i][j] = read();
for(int i = ;i < n / ;++ i)f[n/][i] = -0x3f3f3f3f;
for(int i = n - ;i >= ;-- i){
for(int j = ;j <= i;++ j){
f[i][j] += max(f[i + ][j],f[i + ][j + ]);
}
}
printf("%d",f[][]);
}

数字三角形WWW:

2198 数字三角形WWW

 时间限制: 1 s
 空间限制: 32000 KB
 题目等级 : 钻石 Diamond
 
 
 
题目描述 Description

数字三角形必须经过某一个点,使之走的路程和最大

输入描述 Input Description

第1行n,表示n行 
第2到n+1行为每个的权值
第n+2行为两个数x,y表示必须经过的点

输出描述 Output Description

最大值

样例输入 Sample Input

2
1
1 1
1 1

样例输出 Sample Output

2

数据范围及提示 Data Size & Hint

n<=25

思路:同上一题差不多,就是将n / 2那一行改成x,然后特判一下y位置就好了,不多说,上代码.

代码:

 #include <iostream>
#include <cstdio>
#define X 30 int f[X][X]; inline int read(){
int x = ,f = ;char c = getchar();
while(c < '' || c > ''){if(c == '-')f = -;c = getchar();}
while(c >= '' && c <= ''){x = x * + c - '';c = getchar();}
return x * f;
} int max(int x,int y){
return x > y ? x : y;
} int main(){
int n = read(),x,y,tmp;
for(int i = ;i <= n;++ i)
for(int j = ;j <= i;++ j)
f[i][j] = read();
x = read(),y = read();
tmp = f[x][y];
for(int i = ;i <= x;++ i)f[x][i] = -0x3f3f3f3f;
f[x][y] = tmp;
for(int i = n - ;i >= ;-- i){
for(int j = ;j <= i;++ j){
f[i][j] += max(f[i + ][j],f[i + ][j + ]);
}
}
printf("%d",f[][]);
}

codevs 数字三角形集结的更多相关文章

  1. Codevs 数字三角形 问题合集

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

  2. codevs——T1220 数字三角形

    http://codevs.cn/problem/1043/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descr ...

  3. codevs 1220 数字三角形

    1220 数字三角形  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 如图所示的数字三角形,从顶部出发,在每 ...

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

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

  5. [CODEVS] 2193 数字三角形WW

    数字三角形必须经过某一个点,使之走的路程和最大 从必须经过的点,向上向下分别DP两次的和即为答案. 还有一种思路是把和必须经过点同一行的设为-INF,这样就一定(大概)不会选择它们了. //Write ...

  6. [CODEVS] 2189 数字三角形W

    数字三角形 要求走到最后mod 100最大 可达性DP(好像是这样叫) 用bool数组f[i][j][k]表示 位置(i,j)能否得到k(mod 100意义下) 转移条件 f[i][j][k]=f[i ...

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

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

  8. 数字三角形W(加强版) codevs 2189

    2189 数字三角形W 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题目描述 Description 数字三角形 要求走到最后mod 100最大 输入描述 Inpu ...

  9. G:数字三角形

    总时间限制: 1000ms 内存限制: 65536kB描述73   88   1   02   7   4   44   5   2   6   5 (图1) 图1给出了一个数字三角形.从三角形的顶部 ...

随机推荐

  1. JAVA团队开发手册 - 3. 开发流程

    开发流程 对于一个项目,最大的问题就是如何拆解为任务,分配到合适的人手里,并在有限的时间内完成它. 就像做建筑工程一样,其实做IT也是可以量化的,可能有的人砌砖砌得慢一些,有的人快一些. 但是我们把整 ...

  2. 如何利用python制作微信好友头像照片墙?

    这个不难,主要用到itchat和pillow这2个库,其中itchat用于获取微信好友头像照片,pillow用于拼接头像生成一个照片墙,下面我简单介绍一下实现过程,代码量不多,也很好理解,实验环境wi ...

  3. HDU4089(概率dp)

    题解 要点: 1.转移方程分三段,这个……有点复杂但是还好吧……大概就是求啥设啥,然后只通过可行的状态过来.在纸上记一记. 2.每层里面必须先求dp[i][i],简直就是我求我自己……用类似进制数那种 ...

  4. 洛谷 P1086 花生采摘

    P1086 花生采摘 将植株按花生数从大到小排序,然后按排序后的顺序摘,每次摘前计算能否在摘后回到路边,如果能就将ans加上该植株花生数,如果不能就直接输出当前ans并退出. var a:array[ ...

  5. 107 Binary Tree Level Order Traversal II 二叉树的层次遍历 II

    给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶节点所在层到根节点所在的层,逐层从左向右遍历)例如:给定二叉树 [3,9,20,null,null,15,7],    3   / \  9 ...

  6. 获取span里面的值(特殊情况下 )

    如何获取A? <div class="warpper"> <span class="content"> A <span>12 ...

  7. JDK原子类操作

    JDK原子类操作及原理 在JDK5之后,JDK提供了对变量的原子类操作, java.util.concurrent.atomic里都是原子类 原子类的分类 原子更新基本类型 原子更新数组 原子更新抽象 ...

  8. Sonar静态代码扫描环境搭建(Windows10)

    一.环境配置: 1.jdk安装及配置 2.MySQL数据库安装----直接调用服务器院端的MySQL数据库,在此基础上创建新的数据库sonar.  数据库的配置如下: 3.sonar官网下载sonar ...

  9. windows 服务器开设端口

    主要用于服务器建设网站的时候开设端口 依次点击“开始”—“控制面板”—“windows防火墙” 2 先点击“打开或关闭windows防火墙”将windows防火墙打开 3 点击“高级设置” 4 设置入 ...

  10. 在线matlab网站

    网址: http://octave-online.net/ 使用: