UVA 10564 - Paths through the Hourglass (dp)
本文出自 http://blog.csdn.net/shuangde800
f[i][j][k] 代表从(i,j)点往下走到最后一层和为k的方案数
那么,显然可以得到状态转移:
f[i][j][k] = f[i+1][left][k-val] + f[i+1][right][k-val], val=(i,j)格上的数字,left是往坐下走的坐标,right往右下走的坐标
/**==========================================
* This is a solution for ACM/ICPC problem
*
* @author: shuangde
* @blog: blog.csdn.net/shuangde800
* @email: zengshuangde@gmail.com
*===========================================*/ #include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
#include<cstring>
using namespace std; typedef long long int64;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0); int n, s;
int hourGlass[50][22];
int64 f[50][22][510]; void input(){
for(int i=1; i<=n; ++i)
for(int j=1; j<=n-i+1; ++j)
scanf("%d", &hourGlass[i][j]); for(int i=n+1; i<=2*n-1; ++i)
for(int j=1; j<=i+1-n; ++j)
scanf("%d", &hourGlass[i][j]); } void print_path(int i, int j, int sum){
if(i >= 2*n-1) return;
int val = hourGlass[i][j];
if(i<n){
if(j>1 && f[i+1][j-1][sum-val]){
printf("L");
print_path(i+1, j-1, sum-val);
return ;
}
printf("R");
print_path(i+1, j, sum-val); }else{
if(f[i+1][j][sum-val]){
printf("L");
print_path(i+1, j, sum-val);
return;
}
printf("R");
print_path(i+1, j+1, sum-val);
}
} int main(){ while(~scanf("%d%d", &n, &s) && n+s){ input();
memset(f, 0, sizeof(f)); // 初始化最下面一行
for(int i=1; i<=n; ++i)
f[2*n-1][i][hourGlass[2*n-1][i]] = 1; // 下半部分dp
for(int i=2*n-2; i>=n; --i){
for(int j=1; j<=i+1-n; ++j){
for(int v=hourGlass[i][j]; v<=s; ++v){
int w = hourGlass[i][j];
f[i][j][v] = f[i+1][j][v-w] + f[i+1][j+1][v-w];
}
}
} // 上半部分dp
int64 ans = 0;
for(int i=n-1; i>=1; --i){
for(int j=1; j<=n-i+1; ++j){
for(int v=hourGlass[i][j]; v<=s; ++v){
int w = hourGlass[i][j];
if(j>1) f[i][j][v] += f[i+1][j-1][v-w];
if(j<n-i+1) f[i][j][v] += f[i+1][j][v-w];
}
if(i==1) ans += f[1][j][s];
}
} cout << ans << endl;
for(int i=1; i<=n; ++i){
if(f[1][i][s]){
printf("%d ", i-1);
print_path(1, i, s);
break;
}
}
puts(""); }
return 0;
}
UVA 10564 - Paths through the Hourglass (dp)的更多相关文章
- 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[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
传送门:https://vjudge.net/problem/UVA-10564 题目大意:给你一张形如沙漏一般的图,每一个格子有一个权值,问你有多少种方案可以从第一行走到最后一行,并且输出起点最靠前 ...
- 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 10163 Storage Keepers(两次DP)
UVA 10163 Storage Keepers(两次DP) http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Ite ...
- uva 11584 Partitioning by Palindromes 线性dp
// uva 11584 Partitioning by Palindromes 线性dp // // 题目意思是将一个字符串划分成尽量少的回文串 // // f[i]表示前i个字符能化成最少的回文串 ...
随机推荐
- NRE
NRE是Non-Recurring Engineering的缩写,NRE费用即一次性工程费用,是指集成电路生产成本中非经常性发生的开支,明确地说就是新的集成电路产品的研制开发费·新产品开发过程中的设计 ...
- 坚果云创业团队访谈:我们 DIY 云存储(不要过度关注竞争对手,尤其当我们还是小公司的时候)
坚果云(http://jianguoyun.com/)是一款用于多平台文件同步.备份和交换的云存储工具,立志于提供“便捷,安全”的服务.坚果云自去年年初启动内测,至今年三月初刚刚正式发布.近日我们拜访 ...
- web storm使用和配置
官网:http://www.jetbrains.com/webstorm/ webStorm,File=>setting=>JavaScript-Libraries How WebStor ...
- 【HDOJ】1061 Rightmost Digit
这道题目可以手工打表,也可以机器打表,千万不能暴力解,会TLE. #include <stdio.h> #define MAXNUM 1000000001 ][]; int main() ...
- 【HDOJ】1003 Max Sum
最开始使用递归DP解,stack overflow.化简了一些,复杂度为O(n)就过了. #include <stdio.h> int main() { int case_n, n; in ...
- hadoop2.2编程:各种API
hadoop2.2 API http://hadoop.apache.org/docs/r0.23.9/api/index.html junit API http://junit.org/javado ...
- C#开发漂亮的数字时钟
今天用C#做了一个漂亮的数字时钟.界面如下. 实现技术:主要是通过Graphics类的DrawImage方法来绘制数字时钟中所有的数字,这些数字是从网上找的一些图片文件.时钟使用DateTime中No ...
- cgi ISAP sapi等
1.CGI和FastCGI是apache处理php脚本的其中两种工作模式,还有ISAPI,SAPI等 2.而php-fpm并不是一种工作模式,而是一个PHP在FastCGI模式运行下的进程管理器,全称 ...
- ☀【jQuery 优化】jQuery基础教程(第3版)
jQuery代码优化:选择符篇 √ http://www.ituring.com.cn/article/377 jQuery代码优化:遍历篇 √ http://www.ituring.com.cn/a ...
- SQL Server 地理数据库中的系统表
转自:http://resources.arcgis.com/zh-cn/help/main/10.1/index.html#/na/002q00000080000000/ 地理数据库的系统表可以强制 ...