本文出自 http://blog.csdn.net/shuangde800
题意:
给一个相上面的图。要求从第一层走到最下面一层,只能往左下或右下走,经过的数字之和为sum。
问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径。
思路:
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;
}
分享到:
相关推荐
基于java的开发源码-最短路径算法实现 k-shortest-paths.zip 基于java的开发源码-最短路径算法实现 k-shortest-paths.zip 基于java的开发源码-最短路径算法实现 k-shortest-paths.zip 基于java的开发源码-最短路径...
tsconfig-paths-webpack-plugin 使用tsconfig.json时,可使用此选项加载其位置在tsconfig.json的paths部分中指定的模块。 该软件包提供软件包的功能,但作为Webpack插件。 使用这个插件意味着你将不再需要添加alias...
开源项目-muesli-go-app-paths.zip,go-app-paths lets you retrieve platform-specific paths, like app-data, cache, config and logs
最短路径算法实现 k-shortest-paths
TypeScript节点tsconfig-paths演示 在tsconfig.json中定义的paths仅供打字稿类型检查使用。当它被编译成JS时,并不会被替换,所以节点无法直接执行。 node配合tsconfig-paths使用,可以动态替换。 这种做法不太好的...
前端开源库-amd-paths-collectionAMD路径集合,AMD路径集合
ts-paths 对 tsc 命令做了一些扩展 tsconfig.json 中 paths 参数对文件路径做了映射,但是编译时并没有把路径替换,所以在此命令中做了处理 使用 yarn add --dev ts-paths npx ts-paths build ./ -t tsconfig.json -...
ts-transform-paths 使用它来加载其位置在tsconfig.json的path部分中指定的模块。 安装 yarn add ts-transform-paths -D 要求 打字稿> = 2.4.1 如何使用 不幸的是,TypeScript本身目前还没有提供使用自定义转换器的...
前端开源库-electrode-static-paths电极静态路径,电极服务器花色,使用惰性材料提供静态文件
JAVA源码最短路径算法实现 k-shortest-paths提取方式是百度网盘分享地址
基于Java的最短路径算法实现 k-shortest-paths.zip
基于java的最短路径算法实现 k-shortest-paths.zip
基于Java的实例源码-最短路径算法实现 k-shortest-paths.zip
java源码:最短路径算法实现 k-shortest-paths.zip
ps-paths-to-imagemap, Photoshop imagemap生成脚本 ps-paths-to-imagemapA imagemap生成脚本我曾经试图找到一种简单的方法来创建一个复杂的图像地图,并不包括 sdl 。 我失败了。我不仅仅是在 Twitter ( 我通常会做...
前端开源库-global-paths全局路径,返回基于用户平台和环境的唯一“全局”目录数组。生成的路径可用于查找生成器或其他全局安装的NPM包。node.js/javascript。
tsconfig-paths-absolute 测试绝对路径支持问题绝对路径# Will break on the absolute path that is instead of left the same: `/Users/mprinc/data/development/colabo-zontik/colabo-lab/typescript/tsconfig-...
北大POJ1942-Paths on a Grid 解题报告+AC代码
Simpla-paths在NPM / Yarn,Bower和Unpkg CDN上可用 $ npm i simpla-paths --save $ bower i simpla-paths --save https://unpkg.com/simpla-paths@^1.0.0 在页面上 ,然后在<head>包含simpla-paths。 Simpla...
Allegro 环境变量值设置说明; Allegro-paths&placement&route设置说明; Allegro搜索路劲设置;