UVA 10564 计数DP
也是经典的计数DP题,想练练手,故意不写记忆化搜索,改成递推,还是成功了嘞。。。不过很遗憾一开始WA了,原来是因为判断结束条件写个 n或s为0,应该要一起为0的,搞的我以为自己递推写挫了,又改了一下,其实递推没问题,就是写出来不好看
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL long long
using namespace std;
const int N=80;
LL dp[N][N][1000];
int mat[N][N];
int p[N][N][1000];
int n,s;
void print(int d,int loc,int s)
{
if (d==2*n-1) return;
int val=mat[d][loc];
if (d<n){
if (dp[d+1][loc-1][s-val] && loc>1){
putchar('L');
print(d+1,loc-1,s-val);
return;
}
else {
putchar('R');
print(d+1,loc,s-val);
}
}
else{
if (dp[d+1][loc][s-val]){
putchar('L');
print(d+1,loc,s-mat[d][loc]);
return;
}
else{
putchar('R');
print(d+1,loc+1,s-mat[d][loc]);
}
}
}
int main()
{
while (scanf("%d%d",&n,&s)!=EOF)
{
if (n==0 &&s==0) break;
memset(mat,0,sizeof mat);
for (int i=1;i<=2*n-1;i++){
int k;
if (i<=n) k=n-i+1;
else k=i-n+1;
for (int j=1;j<=k;j++){
scanf("%d",&mat[i][j]);
}
}
memset(dp,0,sizeof dp);
for (int i=1;i<=n;i++){
dp[2*n-1][i][mat[2*n-1][i]]=1;
}
for (int i=2*n-2;i>=1;i--)
{
int k;
if (i>=n) k=i-n+1;
else k=n-i+1;
if (i>=n){
for (int j=1;j<=k;j++){
for (int q=mat[i][j];q<=s;q++){
dp[i][j][q]+=dp[i+1][j][q-mat[i][j]];
dp[i][j][q]+=dp[i+1][j+1][q-mat[i][j]];
}
}
}
else{
for (int j=1;j<=k;j++){
for (int q=mat[i][j];q<=s;q++){
dp[i][j][q]+=dp[i+1][j][q-mat[i][j]];
dp[i][j][q]+=dp[i+1][j-1][q-mat[i][j]];
}
}
}
}
LL ans=0;
int loc=-1;
for (int i=1;i<=n;i++){
ans+=dp[1][i][s];
if (dp[1][i][s] && loc==-1){
loc=i;
}
}
printf("%lld\n",ans);
if (ans>0)
{
printf("%d ",loc-1);
print(1,loc,s);
}
puts("");
}
return 0;
}
UVA 10564 计数DP的更多相关文章
- UVA 10564 Paths through the Hourglass[DP 打印]
UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...
- UVA 10564 十 Paths through the Hourglass
Paths through the Hourglass Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & % ...
- 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 ...
- HDU5800 To My Girlfriend 背包计数dp
分析:首先定义状态dp[i][j][s1][s2]代表前i个物品中,选若干个物品,总价值为j 其中s1个物品时必选,s2物品必不选的方案数 那么转移的时候可以考虑,第i个物品是可选可可不选的 dp[i ...
- CodeForces 176B Word Cut (计数DP)
Word Cut Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit St ...
- [DP之计数DP]
其实说实在 我在写这篇博客的时候 才刚刚草了一道这样类型的题 之前几乎没有接触过 接触过也是平时比赛的 没有系统的做过 可以说0基础 我所理解的计数dp就是想办法去达到它要的目的 而且一定要非常劲非常 ...
- HDU4815/计数DP
题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=4815] 简单说一下题意: 有n道题,每到题答对得分为a[ i ],假如A不输给B的最小概率是P,那么A ...
- HDU 6377 度度熊看球赛 (计数DP)
度度熊看球赛 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- 计数dp
计数dp 计数类的$dp$没做过几个,所以之前都放到"思维"标签下了,后来发现原来这属于一类问题啊...搬过来了. 管道取珠:https://www.lydsy.com/Judge ...
随机推荐
- mysql将一个表拆分成多个表(一)(转载)
转载 直接根据数据量进行拆分 有一个5000条数据的表,要把它变成没1000条数据一个表的5等份. 假设:表名:xuesi 主键:kidxuesi共有5000条数据,kid从1到5000自动增长题目: ...
- mysql判断数据库或表是否存在
(1) 判断数据库存在, 则删除: drop database if exists db_name;(2) 判断数据表存在, 则删除: drop table if exists table ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:表示信息变化的操作
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- sqlplus 登陆使用
select * from dept; input order by dname; 追加文本命令 del n 删除语句 celar buffer ; 清除缓冲区的命令 conn sys as ...
- Ubuntu的妥协将支持精选的32位应用
据外媒Tom's hardware,Ubuntu开发人员Canonical在早先的时候宣布Ubuntu 19.10将不再更新32位软件包和应用程序,引来了诸多应用开发者的不满.现在,Ubuntu方面宣 ...
- CSS-fontface
@font-face { font-family: <identifier>; src: <fontsrc> [, <fontsrc>]*; <font> ...
- 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:包装类
public class WrapperDemo01{ public static void main(String args[]){ int x = 30 ; // 基本数据类型 Integer i ...
- 百度地图javascript API,每个功能每天免费的次数
- 如何看Analysis分析图
第一步,从分析Summary的事务执行情况入手. Summary主要是判定事务的响应时间与执行情况是否合理.如果发现问题,则需要作进一步分析.通常情况下,如果事务执行情况失败或者响应时间过长等,都需要 ...
- linux下解决git clone太慢
此教程同样也适用与vscode下载太慢的问题 git和vscode会自动使用http_proxy,https_proxy环境变量的代理,所以我们只需要设置这个环境变量即可 前提 需要一个可用的代理,这 ...