UVA - 10564 Paths through the Hourglass
传送门:https://vjudge.net/problem/UVA-10564
题目大意:给你一张形如沙漏一般的图,每一个格子有一个权值,问你有多少种方案可以从第一行走到最后一行,并且输出起点最靠前的方案,以及此方案的起点编号,起点相同则字典序最小。
题解:
很容易想到一个DP,dp[i][j][S]代表到第i层,第j列,从第一层到这里的路径和为S的方案数,最后只要查询最后一行的方案数即可了。但是这样很不好输出方案!我们可能需要从终点向上dfs,但是又无法保证起点编号最小以及字典序最小。但是我们能从终点向上dfs,那么如果我们反过来DP呢?可行啊,这样就可以从起点向终点dfs了,贪心选择可行的路径即可。
需要注意的是上下两个一半的沙漏的转移一个是到j与j+1,一个是j与j-1,要考虑清楚细节!
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define RG register
#define LL long long
#define fre(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);
using namespace std;
const int MAXN=,MAXS=;
int n;
LL ans,S;
LL a[MAXN*][MAXN],dp[MAXN*][MAXN][MAXS];
void dfs(int x,int y,int sum);
int main()
{
while(scanf("%d%lld",&n,&S)!=EOF)
{
if(n+S==)break;
for(int i=;i<=n;i++) for(int j=;j<=n-i+;j++) scanf("%lld",&a[i][j]);
for(int i=n+;i<*n;i++) for(int j=;j<=i-n+;j++) scanf("%lld",&a[i][j]);
memset(dp,,sizeof dp);
for(int i=;i<=n;i++) dp[n*-][i][a[n*-][i]]=;
for(int i=n*-;i>=n;i--)
for(int j=;j<=i-n+;j++)
for(int k=;k<=S;k++)
{
if(dp[i+][j][k] && k+a[i][j]<=S) dp[i][j][k+a[i][j]]+=dp[i+][j][k];
if(dp[i+][j+][k] && k+a[i][j]<=S) dp[i][j][k+a[i][j]]+=dp[i+][j+][k];
}
for(int i=n-;i>=;i--)
for(int j=;j<=n-i+;j++)
for(int k=;k<=S;k++)
{
if(dp[i+][j][k] && k+a[i][j]<=S) dp[i][j][k+a[i][j]]+=dp[i+][j][k];
if(dp[i+][j-][k] && k+a[i][j]<=S) dp[i][j][k+a[i][j]]+=dp[i+][j-][k];
}
ans=; for(int i=;i<=n;i++) ans+=dp[][i][S]; printf("%lld\n",ans);
for(int i=;i<=n;i++)
if(dp[][i][S])
{
printf("%d ",i-);
int x=,y=i,sum=S;
while(x<n*-)
{
if(x<n)
{
if(dp[x+][y-][sum-a[x][y]]) sum-=a[x][y],y--,printf("L");
else sum-=a[x][y],printf("R");
}
else
{
if(dp[x+][y][sum-a[x][y]]) sum-=a[x][y],printf("L");
else sum-=a[x][y],y++,printf("R");
}
x++;
}
break;
}
printf("\n");
}
return ;
}
UVA - 10564 Paths through the Hourglass的更多相关文章
- UVA 10564 Paths through the Hourglass[DP 打印]
UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...
- 01背包(类) UVA 10564 Paths through the Hourglass
题目传送门 /* 01背包(类):dp[i][j][k] 表示从(i, j)出发的和为k的方案数,那么cnt = sum (dp[1][i][s]) 状态转移方程:dp[i][j][k] = dp[i ...
- UVA 10564 - Paths through the Hourglass (dp)
本文出自 http://blog.csdn.net/shuangde800 题目传送门 题意: 给一个相上面的图.要求从第一层走到最下面一层,只能往左下或右下走,经过的数字之和为sum. 问有多少 ...
- UVA 10564 Paths through the Hourglass(背包)
为了方便打印路径,考虑从下往上转移.dp[i][j][S]表示在i行j列总和为S的方案, dp[i][j][S] = dp[i+1][left][S-x]+dp[i+1][right][S-x] 方案 ...
- UVA 10564_ Paths through the Hourglass
题意: 由0-9的数字组成一个形如沙漏的图形,要求从第一行开始沿左下或者右下到达最后一行,问有多少种不同的路径,使最后路径上的整数之和为给定的某个数. 分析: 简单计数dp,从最后一行开始,设dp[i ...
- UVA 10564 十 Paths through the Hourglass
Paths through the Hourglass Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & % ...
- uva 10564
Problem FPaths through the HourglassInput: Standard Input Output: Standard Output Time Limit: 2 Seco ...
- UVa 10564 DP Paths through the Hourglass
从下往上DP,d(i, j, k)表示第(i, j)个格子走到底和为k的路径条数. 至于字典序最小,DP的时候记录一下路径就好. #include <cstdio> #include &l ...
- UVA 10564 计数DP
也是经典的计数DP题,想练练手,故意不写记忆化搜索,改成递推,还是成功了嘞...不过很遗憾一开始WA了,原来是因为判断结束条件写个 n或s为0,应该要一起为0的,搞的我以为自己递推写挫了,又改了一下, ...
随机推荐
- JQuery插件ajaxFileUpload 异步上传文件
一.先对ajaxFileUpload插件的语法参数进行讲解 原理:ajaxfileupload是通过监听iframe的onload方法来实现, 当从服务端处理完成后,就触发iframe的onload事 ...
- 关于数组类型的json解析方法
遇到了非常奇葩的数组类型的json,一时解析不出来,用jsonObject会直接报错. Json数据如: [{"id":"1000142","name ...
- 对JS闭包的理解
闭包,是JS里很重要的一个概念,也是相对来讲不太容易理解的一个东西,不过即使难理解,我们也要迎难而上啊,嘿嘿,网上有很多文章都在讲闭包,我在看JS设计模式的时候,书里也着重讲了闭包,但是书里官方的的确 ...
- 浅谈JavaScript的Canvas(绘制图形)
HTML5中新增加的一个元素canvas,要使用canvas元素,浏览器必须支持html5.通过canvas标签来创建元素,并需要为canvas指定宽度和高度,也就是绘图区域的大小. <canv ...
- word2vec学习 spark版
参考资料: http://ir.dlut.edu.cn/NewsShow.aspx?ID=291 http://www.douban.com/note/298095260/ http://machin ...
- C# List Find方法
https://blog.csdn.net/knqiufan/article/details/77847143
- maven依赖排除
单依赖过滤 同依赖过滤直接处理:可以过滤一个或者多个,如果过滤多个要写多个<exclusion>. <dependency> <groupId>org.apache ...
- 织梦系统如何设置URL绝对路径及绝对路径的好处
今天,和大家分享下织梦系统如何设置URL绝对路径及绝对路径的好处,我的一些就是用的织梦系统,感觉织梦在SEO优化方面做的还是非常好的,至少在CMS系统中应该是做的最出色的吧!下面,我就先来讲下这个织梦 ...
- jQuery制作信息提示弹出层插件【推荐】
给大家分享一款非常实用的弹窗提示窗口插件,包含多种模式.带有回执函数值的功能.1. [代码][JavaScript]代码 <script type="text/javascript& ...
- poj 1860 Currency Exchange 解题报告
题目链接:http://poj.org/problem?id=1860 题目意思:给出 N 种 currency, M种兑换方式,Nick 拥有的的currency 编号S 以及他的具体的curren ...