也是经典的计数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的更多相关文章

  1. UVA 10564 Paths through the Hourglass[DP 打印]

    UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...

  2. UVA 10564 十 Paths through the Hourglass

     Paths through the Hourglass Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & % ...

  3. 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 ...

  4. HDU5800 To My Girlfriend 背包计数dp

    分析:首先定义状态dp[i][j][s1][s2]代表前i个物品中,选若干个物品,总价值为j 其中s1个物品时必选,s2物品必不选的方案数 那么转移的时候可以考虑,第i个物品是可选可可不选的 dp[i ...

  5. CodeForces 176B Word Cut (计数DP)

    Word Cut Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit St ...

  6. [DP之计数DP]

    其实说实在 我在写这篇博客的时候 才刚刚草了一道这样类型的题 之前几乎没有接触过 接触过也是平时比赛的 没有系统的做过 可以说0基础 我所理解的计数dp就是想办法去达到它要的目的 而且一定要非常劲非常 ...

  7. HDU4815/计数DP

    题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=4815] 简单说一下题意: 有n道题,每到题答对得分为a[ i ],假如A不输给B的最小概率是P,那么A ...

  8. HDU 6377 度度熊看球赛 (计数DP)

    度度熊看球赛 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  9. 计数dp

    计数dp 计数类的$dp$没做过几个,所以之前都放到"思维"标签下了,后来发现原来这属于一类问题啊...搬过来了. 管道取珠:https://www.lydsy.com/Judge ...

随机推荐

  1. Linux-使用之vim出现的问题

    参考来源: https://stackoverflow.com/questions/47667119/ycm-error-the-ycmd-server-shut-down-restart-wit-t ...

  2. OpenCV数字识别

    输入命令: conda install opencv 返回信息:

  3. php 等于不等于 一个感叹号两个等于号

    $a == $b 等于 TRUE,如果 $a 等于 $b. $a === $b 全等 TRUE,如果 $a 等于 $b,并且它们的类型也相同.(PHP 4 引进) $a != $b 不等 TRUE,如 ...

  4. Day2-I-Knight's Problem POJ - 3985

    You must have heard of the Knight's Tour problem. In that problem, a knight is placed on an empty ch ...

  5. Flask与Django哪个更好更实用呢?砖家是这么认为的

        这一周我打算做一个 Flask 教程.本文先把 Flask 和 Django 做一个比对,因为我对这两个 Python Web 框架都有实际的开发经验.希望我可以帮助您选择学习哪个框架,因为学 ...

  6. 5.8 Nginx 常用功能的配置

  7. C# 篇基础知识10——多线程

    1.线程的概念 单核CPU的计算机中,一个时刻只能执行一条指令,操作系统以“时间片轮转”的方式实现多个程序“同时”运行.操作系统以进程(Process)的方式运行应用程序,进程不但包括应用程序的指令流 ...

  8. Java安全中的“大坑”,跨平台真“浮云”

    Java安全HttpDB 最近在做一个开源项目HttpDB,它的目标是在互联网中通过JDBC安全的查询数据库,解决云计算报表的数据库访问问题. 数据传输使用AES加密算法,用到了Java提供的安全库j ...

  9. js默认字符处理

    utf-16 每个字符是2个字节 超过2字节,就是4个字节表示

  10. 动态设置html根字体大小(随着设备屏幕的大小而变化,从而实现响应式)

    代码如下:如果设置了根字体大小,font-size必须是rem var html =document.querySelector('html'); html.style.fontSize = docu ...