codevs 数字三角形集结
添在前面的一句话:初学DP,若有错误,请指出,不能误人子弟,欢迎大家提出意见.水平不高,博客写的比较粗糙,代码也挺丑,请见谅.
最原始的数字三角形:
如图所示的数字三角形,从顶部出发,在每一结点可以选择向左走或得向右走,一直走到底层,要求找出一条路径,使路径上的值最大。

第一行是数塔层数N(1<=N<=100)。
第二行起,按数塔图形,有一个或多个的整数,表示该层节点的值,共有N行。
输出最大值。
5
13
11 8
12 7 26
6 14 15 8
12 7 13 24 11
86
思路:因为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
数字三角形
要求走到最后mod 100最大
第1行n,表示n行
第2到n+1行为每个的权值
mod 100最大值
2
1
99 98
99
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
数字三角形必须经过某一个点,使之走的路程和最大
第1行n,表示n行
第2到n+1行为每个的权值
程序必须经过n div 2,n div 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[][]);
}
2
1
1 1
2
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:
数字三角形必须经过某一个点,使之走的路程和最大
第1行n,表示n行
第2到n+1行为每个的权值
第n+2行为两个数x,y表示必须经过的点
最大值
2
1
1 1
1 1
2
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 数字三角形集结的更多相关文章
- Codevs 数字三角形 问题合集
1220 数字三角形 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 如图所示的数字三角形,从顶部出发,在每一结点可以选择向左走或得 ...
- codevs——T1220 数字三角形
http://codevs.cn/problem/1043/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descr ...
- codevs 1220 数字三角形
1220 数字三角形 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 如图所示的数字三角形,从顶部出发,在每 ...
- codevs——1220 数字三角形(棋盘DP)
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 如图所示的数字三角形,从顶部出发,在每一结点可以选择向左走或 ...
- [CODEVS] 2193 数字三角形WW
数字三角形必须经过某一个点,使之走的路程和最大 从必须经过的点,向上向下分别DP两次的和即为答案. 还有一种思路是把和必须经过点同一行的设为-INF,这样就一定(大概)不会选择它们了. //Write ...
- [CODEVS] 2189 数字三角形W
数字三角形 要求走到最后mod 100最大 可达性DP(好像是这样叫) 用bool数组f[i][j][k]表示 位置(i,j)能否得到k(mod 100意义下) 转移条件 f[i][j][k]=f[i ...
- Codevs 4829 [DP]数字三角形升级版
4829 [DP]数字三角形升级版 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 从数字三角形的顶部(如图,第一行的5表示行数)到底 ...
- 数字三角形W(加强版) codevs 2189
2189 数字三角形W 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题目描述 Description 数字三角形 要求走到最后mod 100最大 输入描述 Inpu ...
- G:数字三角形
总时间限制: 1000ms 内存限制: 65536kB描述73 88 1 02 7 4 44 5 2 6 5 (图1) 图1给出了一个数字三角形.从三角形的顶部 ...
随机推荐
- IT兄弟连 JavaWeb教程 JSP动作指令
JSP动作指令语法 JSP动作指令语法格式如下: <jsp:动作名 属性名1="属性值1" 属性名2="属性值2" ... %> JSP具体动作指令 ...
- TensorFlow数据集(一)——数据集的基本使用方法
参考书 <TensorFlow:实战Google深度学习框架>(第2版) 例子:从一个张量创建一个数据集,遍历这个数据集,并对每个输入输出y = x^2 的值. #!/usr/bin/en ...
- php-fpm 高并发 参数调整
工作中经常会遇到会给客户配置服务器,其中有的客户还会有并发量要求,其中也会必须要用负载均衡承载压力的.增加服务器数量肯定能有效的提升服务器承载能力,但只有根据目前已有配置设置好单台服务器才能更好的发挥 ...
- dosbox让DOSBox启动后自动执行命令——自动挂载
学习汇编时. 每次启动DOSBox后,都要挂载.转盘符,于是有一个骚套路. 找到这个:bat文件 用记事本就可以编辑. 拉到最下面,找到[autoexec]部分,补充命令如下: mount c f: ...
- [題解]luogu_P2055假期的宿舍(二分圖最大匹配)
雖然是裸題但是仍然沒有看出來...... 1.每個人都對應一張床(可以的話),這樣把人和床看成點,對應關係就是邊,跑最大匹配看匹配數量夠不夠即可 2.連邊條件:如果一個學生且不回家,那麼他可以睡自己的 ...
- [软件工程基础]2017.11.01 第五次 Scrum 会议
具体事项 燃尽图 每人工作内容 成员 已完成的工作 计划完成的工作 工作中遇到的困难 游心 #8 掌握 Laravel 框架 #10 搭建可用的开发测试环境:#9 阅读分析 PhyLab 后端代码与文 ...
- Memcached 未授权访问漏洞及加固
memcached是一套分布式的高速缓存系统.它以Key-Value(键值对)形式将数据存储在内存中,这些数据通常是应用读取频繁的.正因为内存中数据的读取远远大于硬盘,因此可以用来加速应用的访问. 漏 ...
- 一次dbcp和Hikaricp连接池比较联想到的线程池
最近在测试连接池dbcp和Hikaricp速度时,为了弄清楚Hikaricp速度优势的原因,阅读了二者的源码,源码不是很难,类也没有多少,联想到很多知识,现在来总结一下.
- TreeView显示数据
1.添加默认节点 private void Form1_Load(object sender, EventArgs e) { TreeNode tn = new TreeNode("默认节点 ...
- Scrapy框架的基本组成及功能使用
1.什么是scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架.框架的本质就是集成各种功能.具有很强通用性的项目模板. 2.安装 Linux: pip3 in ...