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 ...
随机推荐
- Linux-使用之vim出现的问题
参考来源: https://stackoverflow.com/questions/47667119/ycm-error-the-ycmd-server-shut-down-restart-wit-t ...
- OpenCV数字识别
输入命令: conda install opencv 返回信息:
- php 等于不等于 一个感叹号两个等于号
$a == $b 等于 TRUE,如果 $a 等于 $b. $a === $b 全等 TRUE,如果 $a 等于 $b,并且它们的类型也相同.(PHP 4 引进) $a != $b 不等 TRUE,如 ...
- 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 ...
- Flask与Django哪个更好更实用呢?砖家是这么认为的
这一周我打算做一个 Flask 教程.本文先把 Flask 和 Django 做一个比对,因为我对这两个 Python Web 框架都有实际的开发经验.希望我可以帮助您选择学习哪个框架,因为学 ...
- 5.8 Nginx 常用功能的配置
- C# 篇基础知识10——多线程
1.线程的概念 单核CPU的计算机中,一个时刻只能执行一条指令,操作系统以“时间片轮转”的方式实现多个程序“同时”运行.操作系统以进程(Process)的方式运行应用程序,进程不但包括应用程序的指令流 ...
- Java安全中的“大坑”,跨平台真“浮云”
Java安全HttpDB 最近在做一个开源项目HttpDB,它的目标是在互联网中通过JDBC安全的查询数据库,解决云计算报表的数据库访问问题. 数据传输使用AES加密算法,用到了Java提供的安全库j ...
- js默认字符处理
utf-16 每个字符是2个字节 超过2字节,就是4个字节表示
- 动态设置html根字体大小(随着设备屏幕的大小而变化,从而实现响应式)
代码如下:如果设置了根字体大小,font-size必须是rem var html =document.querySelector('html'); html.style.fontSize = docu ...