URAL - 1029 dp
题意:
n层楼,每层楼有m个房间。找出一个路径从第一层到达第M层,使得路径上的所有数的和是所有可达路径中最小的,每次上到下一层以后就不能再上去,依次输出路径上的各点在所在层的列数。
题解:
参考链接:传送门
dp[i][j]表示:在第i层楼,第j个房间所消耗的最小花费
dp[i][j]的最优值只能从dp[i-1][j]或者dp[i][j-1]或者dp[i][j+1]来得出,所以dp转移方程
1 for(LL i=2; i<=n; ++i)
2 {
3 for(LL j=1; j<=m; ++j)
4 {
5 if(dp[i][j-1]<dp[i-1][j])
6 {
7 pre[i][j]='L'; //pre数组来记录路径
8 dp[i][j]=dp[i][j-1]+val[i][j]; //dp[i][j]最优由左边的dp[i][j-1]得出
9 }
10 else
11 {
12 pre[i][j]='D';
13 dp[i][j]=dp[i-1][j]+val[i][j]; //dp[i][j]最优由下面dp[i-1]【j】得出
14 }
15 }
16 for(LL j=m; j>=1; --j)
17 {
18 if(dp[i][j+1]+val[i][j]<dp[i][j])
19 {
20 pre[i][j]='R';
21 dp[i][j]=dp[i][j+1]+val[i][j];
22 }
23 }
24 }
AC代码:
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 #include<math.h>
6 #include<vector>
7 #include<queue>
8 #include<stack>
9 #include<map>
10 using namespace std;
11 typedef long long LL;
12 const int maxn=505;
13 const LL MAX=1e15;
14 const int INF=0x3f3f3f3f;
15 const double eps=1e-8;
16 const double PI=3.1415926;
17 const int mod = 1e9+7;
18 LL val[505][505],dp[505][505],v[505];
19 char pre[505][505];
20 LL n,m;
21 int main()
22 {
23 while(~scanf("%lld%lld",&n,&m))
24 {
25 for(LL i=1; i<=n; ++i)
26 {
27 for(LL j=1; j<=m; ++j)
28 scanf("%lld",&val[i][j]);
29 }
30 memset(dp,INF,sizeof(dp));
31 memset(pre,INF,sizeof(pre));
32 for(int i=1; i<=m; ++i)
33 dp[1][i]=val[1][i];
34 for(LL i=2; i<=n; ++i)
35 {
36 for(LL j=1; j<=m; ++j)
37 {
38 if(dp[i][j-1]<dp[i-1][j])
39 {
40 pre[i][j]='L';
41 dp[i][j]=dp[i][j-1]+val[i][j];
42 }
43 else
44 {
45 pre[i][j]='D';
46 dp[i][j]=dp[i-1][j]+val[i][j];
47 }
48 }
49 for(LL j=m; j>=1; --j)
50 {
51 if(dp[i][j+1]+val[i][j]<dp[i][j])
52 {
53 pre[i][j]='R';
54 dp[i][j]=dp[i][j+1]+val[i][j];
55 }
56 }
57 }
58 LL maxx=dp[n][1],pos=1,index=0;
59 for(LL i=2; i<=m; ++i)
60 {
61 if(maxx>dp[n][i])
62 {
63 //printf("**%lld\n",i);
64 maxx=dp[n][i];
65 pos=i;
66 }
67 }
68 v[index++]=pos;
69 //printf("%lld**\n",pos);
70 LL i=n,j=pos;
71 while(i!=1)
72 {
73 //printf("**\n");
74 if(pre[i][j]=='D')
75 {
76 pos=j;
77 i--;
78 v[index++]=pos;
79 }
80 else if(pre[i][j]=='R')
81 {
82 j++;
83 pos=j;
84 v[index++]=pos;
85 }
86 else if(pre[i][j]=='L')
87 {
88 j--;
89 pos=j;
90 v[index++]=pos;
91 }
92 }
93 for(i=index-1; i>=0; --i)
94 {
95 //if(i==0)
96 printf("%lld\n",v[i]);
97 //else printf("%lld ",v[i]);
98 }
99 }
100 return 0;
101 }
URAL - 1029 dp的更多相关文章
- DP+路径 URAL 1029 Ministry
题目传送门 /* 题意:就是从上到下,找到最短路,输出路径 DP+路径:状态转移方程:dp[i][j] = min (dp[i-1][j], dp[i][j-1], dp[i][j+1]) + a[[ ...
- URAL 1029 Ministry
URAL 1029 思路: dp+记录路径 状态:dp[i][j]表示到(i,j)这个位置为止的最少花费 初始状态:dp[1][i]=a[1][i](1<=i<=m) 状态转移:dp[i] ...
- Ural 1029 Ministry 题解
目录 Ural 1029 Ministry 题解 题意 题解 程序 Ural 1029 Ministry 题解 题意 给定一个\(n\times m(1\le n \le10,1\le m \le50 ...
- URAL 1036(dp+高精度)
Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Pract ...
- URAL 1029
题目大意:M层N列的矩阵(各元素均为正整数),找出一个路径从第一层到达第M层,使得路径上的所有数的和是所有可达路径中最小的,每次上到下一层以后就不能再上去,依次输出路径上的各点在所在层的列数. KB ...
- C - K-inversions URAL - 1523 (dp + 线段树)
题目链接:https://cn.vjudge.net/contest/275079#problem/C 具体思路:我们可以分层的去建立,假设我们要找k层,我们可以先把满足1.2....k-1层的满足情 ...
- URAL DP第一发
列表: URAL 1225 Flags URAL 1009 K-based Numbers URAL 1119 Metro URAL 1146 Maximum Sum URAL 1203 Scient ...
- Ural 1073 Square Country (DP)
题目地址:Ural 1073 DP水题.也能够说是背包. #include <iostream> #include <cstdio> #include <string&g ...
- hdu 6006
HDU - 6006 Engineer Assignment 我参考了这份题解. 贴上我比较拙的代码,留念一下. /** * 想到状态压缩的dp问题就解决了一半. */ #include <st ...
随机推荐
- Linux Shell 编程基础详解——吐血整理,墙裂推荐!
第一部分:Linux Shell 简介 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序, ...
- Ubuntu Terminal命令行新建仓库并推送到远程仓库
通常情况下,在本地新建一个仓库之后,需要在远端网页端也新建一个空的同名仓库,然后将两者进行关联才能推送. 那有没有办法直接在命令行就完成从新建到推送的过程而不需要中间在网页端也操作一番呢?办法当然是有 ...
- php压缩文件夹并下载到本地
/** * @param $path 要压缩的文件夹路径 * @param $filename 要生成的压缩包名称 */ public function create_zip($path,$filen ...
- 容器化安装Mysql 8.0 并部署主从复制
系统: Centos 7.4 数据库版本:8.0.20 两台机器做相同操作 安装Docker export VERSION=18.06 && curl -fsSL http://rai ...
- 转 15 jmeter分布式性能测试
15 jmeter分布式性能测试 背景由于jmeter本身的瓶颈,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至还会引起Java内存溢出的错误.要解决这个问题, ...
- PC端微信多开方式.bat(Windows批处理文件)
start 微信安装路径\WeChat.exe start 微信安装路径\WeChat.exe
- Edition-Based Redefinition
Oracle在11g引入了Edition-Based Redefinition(EBR),主要是为了解决在更新数据库对象,比如PL/SQL程序,视图等,如果该对象被锁住了,会导致更新必须等待,如果要使 ...
- poj2631
求一棵树的直径,所谓直径就是树上距离最远的两个点! 树形动归,每个点的为根的子树的最长向下链和次长链的和! 当然也可以二次深搜! ----------------------------------- ...
- EasyExcel导出小结:动态标题、标题格式、相同值合并
1. 实列相关依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel& ...
- Vagrant基本知识、基本操作
Vagrant基本知识.基本操作 一.介绍 二.安装Vagrant 三.安装到Windows 四.准备Boxes 五.基本操作 六.Vagrant常用命令 七.Vagrantfile 7.1 box ...