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 ...
随机推荐
- 世界上最痛苦的事就是去改别人的bug!!!!
世界上最痛苦的事就是去改别人的bug!!!!
- c++ list reverse_iterator
#pragma warning(disable:4786) #include <set> #include <iostream> using namespace std ; t ...
- this总结
this总结,mark一下: Object中的this: Object方法中的this,指向的就是该对象,即谁调用this就指向谁,与C#等服务器语言的思想比较一致. let demo = { nam ...
- strusts annotation
也叫Zero Configuration(零配置),它省去了写xml文件的麻烦,可以直接在类叫进行配置,不用在java文件和xml文件中来回切换. 1.Action级的注解 @ParentPackag ...
- ubuntu-15.04-desktop-amd64.iso:ubuntu-15.04-desktop-amd64:安装Oracle11gR2
ubuntu 桌面版的安装不介绍. 如何安装oracle:核心步骤和关键点. ln -sf /bin/bash /bin/sh ln -sf /usr/bin/basename /bin/basena ...
- supervisorctl unix:///var/run/supervisor.sock refused connection
运行supervisorct 报如下错误 supervisorctl unix:///var/run/supervisor.sock refused connection 查看supervisord. ...
- 高级类特性----抽象类(abstract class)
抽象类(abstract class) 随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用.类的设计应该保证父类和子类能够共享特征.有时将一个父类设计得非常抽象,以至于它没有具 ...
- swif开发之--协议的使用
以前在oc构建的项目中,如果这个页面需要构建一些指定的页面,一般我会重新创建个集成与UIView的类,然后同时创建XXX.xib文件,然后直接在上面拖拽控件,非常快速,当然也可以手动布局!个人更喜欢可 ...
- laravel 查询构建器(连贯操作)
注:laravel 查询返回行的都是 php 的 stdClass 对象实例,不是数组!!!! 1)查询多行(get) DB::table('table_name')->get(); 带偏移和限 ...
- HTTP 基础术语
URI 和 URL:URI用于标记一个网络资源,URL则表示这个网络资源的访问地址,详细说明 超文本:普通的一段文字叫做文本,如果给这段文字加上超链接,那么就叫做超文本,HTML 就是超文本标记语言 ...