POJ1037A decorative fence(好dp)
带点组合的东西吧
黑书P257 其实我没看懂它写的嘛玩意儿
这题还是挺不错的 一个模糊的思路可能会好想一些 就是大体的递推方程 dp1[][]表示降序 dp2[][]表示升序 数组的含义为长度为i的第一个数为j且相对第一个数为升或降的排列数 当然j肯定要小于等于i的
dp1[i][j] = dp1[i][j]+dp2[i-1][k](k》=1&&k<j)
同理 dp2[i][j] = dp2[i][j]+dp1[i-1][k](k>=j&&k<i) 这里是因为dp2[i][j]中的j取不到i(因为后面还要升,就肯定取不到i);
这样任务完成了一半了 一定要深刻理解两个dp数组的含义 不然后半部分没法做
对于确定每一位的长度值 需要一步步的确定 先确定第一位的值 那就是挨个减dp1[n][1]dp2[n][1]..减到小于0时就确定了第一位的值 标记上 同时也确定了整体是升序还是降序 抛开第一位 同样的方式去确定第二位 这里要想清楚一点 因为dp数组里对于长度为i的j都不会大于i 你要找的那个数并不是dp里面的j而是相对第j个没有被标记的数 当然如果是升序 还得大于前一个数 降序还得小于前一个数
不知道为嘛一直TLE 在循环内随便加了个break条件就A了 好神奇~
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<queue>
#include<vector>
#define LL __int64
using namespace std;
LL dp1[][],dp2[][];
int pa[];
bool f[];
int judge(int x)
{
int i,t=;
for(i = ; i <= ; i++)
{
if(!f[i]) t++;
if(t==x)
{
f[i] = ;
return i;
}
}
}
int main()
{
int i,j,g,n,k;
LL c;
scanf("%d",&k);
while(k--)
{
memset(dp1,,sizeof(dp1));
memset(dp2,,sizeof(dp2));
memset(f,,sizeof(f));
scanf("%d%I64d",&n,&c);
dp1[][] = dp2[][] = ;
int tt=;
for(i = ; i <= n ; i++)
{
for(j = ; j <= n ; j++)
{
for(g = ; g < j ; g++)
dp1[i][j]+=dp2[i-][g];
for(g = j ; g < i ; g++)
dp2[i][j]+=dp1[i-][g];
}
}
LL ss=;
int o=,ff;
for(i = ;i <= n ; i++)
{
c-=dp1[n][i];
if(c>)
{
c-=dp2[n][i];
ff = ;
}
else
{
ff=;
}
if(c<=)
{
pa[] = i;
f[i] = ;
if(ff==)
c+=dp2[n][i];
else
c+=dp1[n][i];
int y = n-;
while()
{
tt++;
if(tt>)
break;
int num=;
for(i = ; i <= ; i++)
{
if(i==pa[o])
break;
if(!f[i]) num++;
}
if(ff==)
{
for(i = num+; i <= y ; i++)
{
c-=dp1[y][i];
if(o==n-&&c==)
{
pa[++o] = judge(i);
break;
}
if(c<=)
{
c+=dp1[y][i];
y--;
pa[++o] = judge(i);
ff = ;
break;
}
}
}
else
{ for(i = ; i <= num ; i++)
{
c-=dp2[y][i];
if(o==n-&&c==)
{
pa[++o] = judge(i);
break;
}
if(c<=)
{
c+=dp2[y][i];
y--;
ff = ;
pa[++o] = judge(i);
break;
}
}
}
if(c==)
break;
}
break;
}
}
for(i = ; i < n ; i++)
printf("%d ",pa[i]);
printf("%d\n",pa[n]);
}
return ;
}
POJ1037A decorative fence(好dp)的更多相关文章
- POJ1037A decorative fence(动态规划+排序计数+好题)
http://poj.org/problem?id=1037 题意:输入木棒的个数n,其中每个木棒长度等于对应的编号,把木棒按照波浪形排序,然后输出第c个; 分析:总数为i跟木棒中第k短的木棒 就等于 ...
- POJ1037 A decorative fence
题意 Language:Default A decorative fence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 84 ...
- POJ1037 A decorative fence 【动态规划】
A decorative fence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6489 Accepted: 236 ...
- A decorative fence
A decorative fence 在\(1\sim n\)的全排列\(\{a_i\}\)中,只有大小交错的(即任意一个位置i满足\(a_{i-1}<a_i>a_{i+1}ora_{i- ...
- 【POJ1037】A decorative fence(DP)
BUPT2017 wintertraining(15) #6C 题意 给长度n的数列,1,2,..,n,按依次递增递减排序,求字典序第k小的排列. 题解 dp. up[i][j]表示长度为j,以第i小 ...
- $Poj1037\ A\ Decorative\ Fence$ 计数类$DP$
Poj AcWing Description Sol 这题很数位$DP$啊, 预处理$+$试填法 $F[i][j][k]$表示用$i$块长度不同的木板,当前木板(第$i$块)在这$i$块木板中从小到 ...
- Codeforces 659G Fence Divercity dp
Fence Divercity 我们设a[ i ] 为第 i 个围栏被切的最靠下的位置, 我们发现a[ i ] 的最大取值有一下信息: 如果从i - 1过来并在 i 结束a[ i ] = min(h ...
- Codeforces Round #346 (Div. 2) G. Fence Divercity dp
G. Fence Divercity 题目连接: http://www.codeforces.com/contest/659/problem/G Description Long ago, Vasil ...
- codeforces 659G G. Fence Divercity(dp)
题目链接: G. Fence Divercity time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
随机推荐
- iTween基础之Audio(音量和音调的变化)
一.基础介绍:二.基础属性 原文地址 : http://blog.csdn.net/dingkun520wy/article/details/50826033 一.基础介绍 AudioTo:改变声音的 ...
- Windows程序消息机制浅析
1.消息 消息是由MSG结构体来表示的.如下: typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lPar ...
- 利用QObject反射实现jsonrpc
1.jsonrpc请求中的params数组生成签名 static QString signatureFromJsonArray(const QJsonArray &array) { QStri ...
- Ubuntu重启网络/etc/init.d/networking restart报错
Linux版本:Ubuntu 12.04 配置网口后重启网络,提示/etc/init.d/networking restart is deprecated. $ sudo /etc/init.d/ne ...
- win8安装matlab7.0
win8和win7下安装matlab7.0要注意许多地方,其实安装最新版一般都是没有问题的. 不过最新版太大,校园网下载太难,所以还是用7.0 基本上在百度经验上已经包括了大部分的注意事项了,可以参考 ...
- 《C++Primer》复习——with C++11 [3]
1.我们的程序经常使用很多IO库,用来输入输出例如:istream(输入流)类型,提供输入操作. ostream(输出流)类型, 提供输出操作. cin, 一个istream对象,从标准输入读取数据. ...
- 生成最小树prim算法
最小生成树prim算法实现 ‘ ’最小生成树,就是权值(两点间直线的值)之和的最小值. 首先,要用二维数组记录点和权值.如上图所示无向图: int G[6][6]; G[1] ...
- ViewController 优化
解决问题:部分复杂页面的Controller过于庞大,不利于维护与复用: 复杂的页面大多是基于tableview的页面.复杂页面的代码大致可分为两部分(复杂的View布局用Nib实现的话,一般大家都是 ...
- 解决Ubuntu开机自动挂载硬盘回收站不可用等权限问题
1.修改fstab sudo gedit /etc/fstab 2.添加如下代码 #Entry for /dev/sdb7 : UUID=78A675EB46D703C4 /media/anseey/ ...
- SVN库实时同步设置
为了安全起见,SVN服务器除了做定时全量备份和增量备份以外,如条件允许,可做实时备份. 这需要2台机器,一台是master server,另一台做mirror server.master做主服务,mi ...