$Poj1037\ A\ Decorative\ Fence$ 计数类$DP$
Description
Sol
这题很数位$DP$啊, 预处理$+$试填法
$F[i][j][k]$表示用$i$块长度不同的木板,当前木板(第$i$块)在这$i$块木板中从小到大排在第$j$位,构成栅栏的方案数.$k=0$表示处于低位,$k=1$表示处于高位.
$F[i][j][0]=\sum_{p=j}^{i-1}$
$F[i][j][1]=\sum_{p=1}^{j-1}$
然后这里有一个地方想了挺久的最终在$gql$的$blog$里找到了答案(怎样才能和$gql$一样神仙啊???),就是为什么$F[i][j][0]$的转移方程里$p$从$j$开始而不是$j+1$.这要看它的相对性$qwq$,因为现在第$i$块木板排第$j$,但是前$i-1$块木板里没有当前排第$j$的木板,也就是当前$(j+1,i)$的木板在$i-1$的情况下都会跌一名 : ))
预处理完之后就是"试填法"了!
外层枚举长度(种数)$i$,内层枚举第$i$块木板的长度.要记录第$i$块木板在前$i$块木板里的排名,然后累计当前选择下的栅栏总数,判断当前选择是否正确不是就继续循环下一个.....具体看代码叭.(代码是以前写的,变量名和上面所写的不太一样$OvO$)
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#define Rg register
#define il inline
#define db double
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a));
#define go(i,a,b) for(Rg int i=a;i<=b;i++)
#define yes(i,a,b) for(Rg int i=a;i>=b;i--)
using namespace std;
const int N=;
int n,ans[N];
ll c,a[N][N][];
bool fl[N];
il void init()
{
a[][][]=a[][][]=;
go(len,,)
go(i,,len)
{
go(j,i,len-)a[len][i][]+=a[len-][j][];
go(j,,i-)a[len][i][]+=a[len-][j][];
}
}
il void solve()
{
mem(fl,);ll cnt=;
go(len,,n)
{
int nm=;
go(i,,n)
{
ll lc=cnt;
if(fl[i])continue;
nm++;
if(len==)cnt+=a[n][nm][]+a[n][nm][];
else
{
if(i>ans[len-]&&(ans[len-]<ans[len-]||len<=))cnt+=a[n-len+][nm][];
if(i<ans[len-]&&(ans[len-]>ans[len-]||len<=))cnt+=a[n-len+][nm][];
}
if(cnt<c)continue;
fl[i]=;ans[len]=i;cnt=lc;break;
}
}
go(i,,n)printf("%d ",ans[i]);printf("\n");
}
int main()
{
int T;scanf("%d",&T);
init();
while(T--){scanf("%d%lld",&n,&c);solve();}
return ;
}
随机推荐
- js判断数组或对象是否相等
/** * 验证两个object 是否相同 * @param {Object} obj [需要进行验证的数据1] * @param {Object} newObj [需要进行验证的数据2] */ fu ...
- [C#] Parallel.For的线程数
Parallel.For会自动判断同时运行多少个线程,但你也可以进行干预. ParallelOptions可以设置Parallel.For最大的并发线程.缺省的最大线程数是CPU核数.这通常是不够多的 ...
- JS的作用域链与this指向
JS的作用域链是在函数创建时创建的.而this对象是在函数运行期间绑定的. 下面看几个例子,说明JS的作用域链和this是两套分离的链. 1) var name = 'window下的name< ...
- RBF神经网络通用函数 newrb, newrbe
RBF神经网络通用函数 newrb, newrbe 1.newrb 其中P为输入向量,T为输出向量,GOAL为均方误差的目标,SPREED为径向基的扩展速度.返回值是一个构建好的网络,用newrb ...
- Python--day28--面试题
- Python--day25--复习(单继承和多继承的总结)
- Native memory allocation (mmap) failed to map 142606336 bytes for committing reserved memory.
这里写链接内容 问题描述 Java程序运行过程中抛出java.lang.OutOfMemoryError: unable to create new native thread,如下所示: [java ...
- 《Spring 5官方文档》 Spring AOP的经典用法
原文链接 在本附录中,我们会讨论一些初级的Spring AOP接口,以及在Spring 1.2应用中所使用的AOP支持. 对于新的应用,我们推荐使用 Spring AOP 2.0来支持,在AOP章节有 ...
- H3C 端口绑定典型配置举例
- H3C擦除配置