P2750 贰五语言Two Five USACO5.5 记忆化搜索
正解:记搜+逼近
解题报告:
神仙题预警,,,
我真滴觉得还是挺难的了,,,
大概说下思路趴QAQ
首先我们要知道逼近法是什么!
逼近法,有点像二分的思路,以这题为例举个eg
假如它给了个数字k.我们现在要求b是在(1,2)还是在(2,1)
显然所有b在(1,2)时候的字符串都在(2,1)的前边,且中间没有其他可能排列了
辣我们就先把b放在(1,2)算出这时候的方案数是多少
如果这时候方案数>k,说明b就是在(1,2)
否则在(2,1)
欧克get了趴?
然后知道这个之后,就,说下怎么求方案数呢?
这里我们要用到,轮廓线
显然当我们从小到大填的时候,如果在某一格填入了一个数,它的左上一定都填完了,所以可以发现它形成的轮廓线一定长度递减
然后我们可以用dp递推一下(也可以说是用记搜,,,但我一直jio得记搜属于dp鸭?
大力转移一波就可以得到方案数辣!
overr!
很妙啊我真的觉得!
所以代码大概是下午写QwQ
#include<bits/stdc++.h>
using namespace std;
#define ll int
#define rp(i,x,y) for(register ll i=x;i<=y;++i) ll f[][][][][],s[],ans;//si:第i个位置的字母是什么
bool qd[];//qdi:第i个字母确定了没有 inline ll read()
{
register char ch=getchar();register ll x=;register bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=getchar();
if(ch=='-')ch=getchar(),y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=getchar();
return y?x:-x;
}
inline bool check(ll lt,ll wz){return (!s[wz] || lt==s[wz]);}
ll dfs(ll a,ll b,ll c,ll d,ll e)
{
ll lt=a+b+c+d+e+; //lt:在确定哪个
if(lt>) return ;if(f[a][b][c][d][e]!=)return f[a][b][c][d][e];
if(a< && check(lt,a+))f[a][b][c][d][e]+=dfs(a+,b,c,d,e);
if(b<a && check(lt,b+))f[a][b][c][d][e]+=dfs(a,b+,c,d,e);
if(c<b && check(lt,c+))f[a][b][c][d][e]+=dfs(a,b,c+,d,e);
if(d<c && check(lt,d+))f[a][b][c][d][e]+=dfs(a,b,c,d+,e);
if(e<d && check(lt,e+))f[a][b][c][d][e]+=dfs(a,b,c,d,e+);
return f[a][b][c][d][e];
}
void wk1(ll num)
{
rp(i,,)
{
for(s[i]=;;++s[i])
{
if(qd[s[i]])continue;qd[s[i]]=;memset(f,,sizeof(f));
int tmp=dfs(,,,,);if(ans+tmp>=num)break;ans+=tmp;qd[s[i]]=;
}
}
rp(i,,)cout<<char(s[i]+'A'-);
} void wk2()
{
string str;cin>>str;
ans=;
rp(i,,)
{
for(s[i+]=;s[i+]<=str[i]-'A';s[i+]++)
{
if(qd[s[i+]])continue;qd[s[i+]]=;memset(f,,sizeof(f));
ans+=dfs(,,,,);qd[s[i+]]=;
}
}
cout<<ans+<<endl;
} int main ()
{
char opt;cin>>opt;
if(opt=='N')wk1(read());
else wk2();
return ;
}
然后代码在这里QAQ
P2750 贰五语言Two Five USACO5.5 记忆化搜索的更多相关文章
- [洛谷P2750] [USACO5.5]贰五语言Two Five
洛谷题目链接:[USACO5.5]贰五语言Two Five 题目描述 有一种奇怪的语言叫做"贰五语言".它的每个单词都由A-Y这25个字母各一个组成.但是,并不是任何一种排列都是一 ...
- [HNOI2004]L语言 字典树 记忆化搜索
[HNOI2004]L语言 字典树 记忆化搜索 给出\(n\)个字符串作为字典,询问\(m\)个字符串,求每个字符串最远能匹配(字典中的字符串)到的位置 容易想到使用字典树维护字典,然后又发现不能每步 ...
- 集训第五周动态规划 I题 记忆化搜索
Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...
- 五语言学习系列 C,C++,Objective-C,Java,C# (一)历史
C:由AT&T贝尔实验室的Dennis Ritchie于1972年创建的,是专为开发者设计的语言. C++:在C基础上,1983年又由贝尔实验室的Bjarne Strou-strup推出了C+ ...
- C语言入坑指南-被遗忘的初始化
前言 什么是初始化?为什么要初始化?静态变量和局部变量的初始化又有什么区别?实际应用中应该怎么做?本文将一一回答这些问题. 什么是初始化 初始化指的是对数据对象或者变量赋予初始值.例如: int va ...
- 使用c语言计算分期贷款折算年化收益率(内部收益率IRR*12)
众所周知,现在银行的分期贷款利率是很有诱惑性人.表面看利率是很低的,例如招行的闪电贷有时给我的利率是4.3% 但是,由于贷款是分期还本的,我手上的本金每月都在减少,到最后一个月时手上只有少量本金,但是 ...
- 计算机专业C语言编程学习重点:指针化难为易
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- 多校第五场 归并排序+暴力矩阵乘+模拟+java大数&记忆化递归
HDU 4911 Inversion 考点:归并排序 思路:这题呀比赛的时候忘了知道能够用归并排序算出逆序数,可是忘了归并排序的实质了.然后不会做-- 由于看到题上说是相邻的两个数才干交换的时候.感觉 ...
- Contest1874 - noip基础知识五:动态规划(背包、树dp、记忆化、递推、区间、序列dp、dp优化)
传送门 T1 dp[n][m]=dp[n-1][m-1]+dp[n-m][m] T2 ans=cat(n)*(n!)2 卡特兰数 T3 dp[i][j]=sigma(dp[i-1][j-a[i ...
随机推荐
- 【Java集合的详细研究7】Set和List 的关系与区别
两个接口都是继承自Collection. List (inteface) 次序是List 的最重要特点,它确保维护元素特定的顺序. --ArrayList 允许对元素快速随机访问. --LinkedL ...
- jquery日期插件datePicker
index.html <!DOCTYPE html> <html lang="zh-cn"> <head> <meta http-equi ...
- cesium可视化空间数据2
圆柱圆锥体 <!DOCTYPE html> <html> <head> <!-- Use correct character set. --> < ...
- linux定时任务cron 安装配置
名词解释: cron是服务名称,crond是后台进程,crontab则是定制好的计划任务表. 软件包安装: 要使用cron服务,先要安装vixie-cron软件包和crontabs软件包,两个软件包作 ...
- Ubuntu 16.04 获取 root 用户权限并以 root权限登录
http://blog.csdn.net/csdn_flyyoung/article/details/52966583
- Redis生成Id主键的工具
public class PrimaryKeyGenerator { private static readonly NedisClient client = new NedisClient(GetR ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第14章节--使用Office Services开发应用程序 WOPI和新的Office Web Apps Server
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第14章节--使用Office Services开发应用程序 WOPI和新的Office Web Apps Server ...
- python2.0 s12 day3
s12 day3 视频每节的内容 03 python s12 day3 本节内容概要 第三天的主要内容 上节没讲完的: 6.集合 7.collections 1)计数器 2)有序字典 3)默认字典 4 ...
- editplus修改配置文件保存位置
虚拟桌面默认保存位置为:
- 查看网卡流量:nload
nload命令用于查看网卡流量,用法如下: [root@localhost ~]$ yum install -y epel-release [root@localhost ~]$ yum instal ...