路径条数很好找。记录最小路径,就记录到各点的最小字符串,存储起来。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <stack>
#include <bitset>
#define mkp make_pair
using namespace std;
const double EPS=1e-;
typedef long long lon;
const lon SZ=,INF=0x7FFFFFFF,mod=;
lon n,k,arr[SZ][SZ],dp[SZ][SZ][];
string str[SZ][SZ][]; void init()
{
memset(dp,,sizeof(dp));
for(int i=;i<=*n-;++i)
{
for(lon j=;j<=abs(n-i)+;++j)
{
cin>>arr[i][j];
}
}
for(lon j=;j<SZ;++j)
{
if(j&)dp[][j][]=;
}
} string toStr(lon x)
{
if(x==)return "";
string res="";
for(;x;)
{
res+=''+x%;
x/=;
}
reverse(res.begin(),res.end());
return res;
} bool cmp(const string &x,const string &y)
{
int pos1=x.find(" ");
int pos2=y.find(" ");
if(pos1!=pos2)return pos1<pos2;
else return x<y;
} void work()
{
for(lon i=;i<=*n-;++i)
{
for(lon j=;j<=abs(n-i)+;++j)
{
lon cur=arr[i][j];
for(lon p=arr[i][j];p<=k;++p)
{
if(i<=n)
{
dp[i][j][p]+=dp[i-][j][p-cur];
dp[i][j][p]+=dp[i-][j+][p-cur];
if(i==)
{
str[i][j][p]=toStr(j-)+" ";
}
else if(dp[i-][j][p-cur]&&dp[i-][j+][p-cur])
{
if(cmp(str[i-][j][p-cur],str[i-][j+][p-cur]))
{
str[i][j][p]=str[i-][j][p-cur]+"R";
}
else
{
str[i][j][p]=str[i-][j+][p-cur]+"L";
}
}
else if(dp[i-][j][p-cur])
{
str[i][j][p]=str[i-][j][p-cur]+"R";
}
else if(dp[i-][j+][p-cur])
{
str[i][j][p]=str[i-][j+][p-cur]+"L";
}
}
else
{
dp[i][j][p]+=dp[i-][j-][p-cur];
dp[i][j][p]+=dp[i-][j][p-cur];
if(i==)
{
str[i][j][p]=toStr(j-)+" ";
}
else if(dp[i-][j-][p-cur]&&dp[i-][j][p-cur])
{
if(cmp(str[i-][j-][p-cur],str[i-][j][p-cur]))
{
str[i][j][p]=str[i-][j-][p-cur]+"R";
}
else
{
str[i][j][p]=str[i-][j][p-cur]+"L";
}
}
else if(dp[i-][j-][p-cur])
{
str[i][j][p]=str[i-][j-][p-cur]+"R";
}
else if(dp[i-][j][p-cur])
{
str[i][j][p]=str[i-][j][p-cur]+"L";
}
}
}
}
}
lon res=;
char tmp=(char)(''+);
string minstr="~~~~~~ ";
for(lon j=;j<=n;++j)
{
res+=dp[*n-][j][k];
if(dp[*n-][j][k])
{
//cout<<" "<<str[2*n-1][j][k]<<" "<<(str[2*n-1][j][k]=="")<<endl;
minstr=min(minstr,str[*n-][j][k],cmp);
}
}
cout<<res<<endl;
if(res)cout<<minstr<<endl;
else cout<<endl;
} int main()
{
std::ios::sync_with_stdio();
//freopen("d:\\1.txt","r",stdin);
lon casenum;
//cin>>casenum;
//cout<<casenum<<endl;
//for(lon time=1;time<=casenum;++time)
for(lon time=;cin>>n>>k,n;++time)
{
init();
work();
}
return ;
}

uva10564的更多相关文章

  1. [置顶] 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总

    本文出自   http://blog.csdn.net/shuangde800 刘汝佳<算法竞赛入门经典-训练指南>的动态规划部分的习题Beginner  打开 这个专题一共有25题,刷完 ...

  2. UVA - 10564 Paths through the Hourglass

    传送门:https://vjudge.net/problem/UVA-10564 题目大意:给你一张形如沙漏一般的图,每一个格子有一个权值,问你有多少种方案可以从第一行走到最后一行,并且输出起点最靠前 ...

随机推荐

  1. 启动maven的web项目

    一.可以通过在pom中配置tomcat插件. 首先要确保你的仓库里有这个插件,然后按如下配置. <build> <plugins> <!-- 配置Tomcat插件 --& ...

  2. Python3 tkinter基础 LabelFrame Radiobutton 形成两组不相互限制的单选按钮

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  3. FJUT3591 侦测到在途的聚变打击(最小不可相交路径覆盖)题解

    题意:给你n个点,点间m条路,给出在每条路要走的时间.现在有q个任务,要摧毁q个点,每次提供ci和ti表示在时间ti摧毁点ci(必须正好在时间ti才能摧毁),每个点可能需要多次摧毁(同一时间能在同一个 ...

  4. [CodeForces - 919B] Perfect Number

    题目链接:http://codeforces.com/problemset/problem/919/B AC代码: #include<cstdio> using namespace std ...

  5. js之鼠标随动后面跟随事件(类似于长龙跟着跑)

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  6. C++通过jsoncpp类库读写JSON文件-json用法详解

    介绍: JSON 是常用的数据的一种格式,各个语言或多或少都会用的JSON格式. JSON是一个轻量级的数据定义格式,比起XML易学易用,而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择. ...

  7. 蚂蚁金服×西安银行 | 西安银行手机银行App的智能升级之路

    小蚂蚁说: 当前,数字化信号已经逐渐深入到社会的每个角落,影响着用户的心智和行为,来到数字化时代门口的银行,需要注意到数字化信号.西安银行通过引入蚂蚁金服移动开发平台mPaaS,对手机银行进行架构升级 ...

  8. (一)PHP简介

    什么是 PHP? PHP 是 "PHP Hypertext Preprocessor" 的首字母缩略词 PHP 是一种被广泛使用的开源脚本语言 PHP 脚本在服务器上执行 PHP ...

  9. Flexbox弹性布局,更优雅的布局

    Flexbox,更优雅的布局 Flex 布局教程:语法篇 Flex 布局教程:实例篇 2009年,W3C提出了一种新的方案----Flex布局,可以简便.完整.响应式地实现各种页面布局.目前,它已经得 ...

  10. python中的print()、str()和repr()的区别

    print()函数,我们可以看出,在Python IDLE中直接输入的字符串都是有类型的,而print打印后的字符串相当于一串文字,把字符串的引号也省略了,没有类型 print()函数,生成可读性更好 ...