1037

带点组合的东西吧

黑书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)的更多相关文章

  1. POJ1037A decorative fence(动态规划+排序计数+好题)

    http://poj.org/problem?id=1037 题意:输入木棒的个数n,其中每个木棒长度等于对应的编号,把木棒按照波浪形排序,然后输出第c个; 分析:总数为i跟木棒中第k短的木棒 就等于 ...

  2. POJ1037 A decorative fence

    题意 Language:Default A decorative fence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 84 ...

  3. POJ1037 A decorative fence 【动态规划】

    A decorative fence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6489   Accepted: 236 ...

  4. A decorative fence

    A decorative fence 在\(1\sim n\)的全排列\(\{a_i\}\)中,只有大小交错的(即任意一个位置i满足\(a_{i-1}<a_i>a_{i+1}ora_{i- ...

  5. 【POJ1037】A decorative fence(DP)

    BUPT2017 wintertraining(15) #6C 题意 给长度n的数列,1,2,..,n,按依次递增递减排序,求字典序第k小的排列. 题解 dp. up[i][j]表示长度为j,以第i小 ...

  6. $Poj1037\ A\ Decorative\ Fence$ 计数类$DP$

    Poj  AcWing Description Sol 这题很数位$DP$啊, 预处理$+$试填法 $F[i][j][k]$表示用$i$块长度不同的木板,当前木板(第$i$块)在这$i$块木板中从小到 ...

  7. Codeforces 659G Fence Divercity dp

    Fence Divercity 我们设a[ i ] 为第 i 个围栏被切的最靠下的位置, 我们发现a[ i ] 的最大取值有一下信息: 如果从i - 1过来并在 i  结束a[ i ] = min(h ...

  8. Codeforces Round #346 (Div. 2) G. Fence Divercity dp

    G. Fence Divercity 题目连接: http://www.codeforces.com/contest/659/problem/G Description Long ago, Vasil ...

  9. codeforces 659G G. Fence Divercity(dp)

    题目链接: G. Fence Divercity time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

随机推荐

  1. Team Homework #3: The feedback of predecessors

    此次对学长的采访主要在QQ上进行,感谢陈宇宁学长的热情配合. 采访学长的问题及学长的答复如下: 1. 平均每周花在这门课上的时间 (包括上课/作业/上机) -大约15-20小时吧(学长个人花费时间) ...

  2. Android SDK Android NDK 官方下载地址

    Android NDK r6b Windows http://dl.google.com/android/ndk/android-ndk-r6b-windows.zip Mac OS X(intel) ...

  3. [搜片神器]winform程序自己如何更新自己的方法代码

    DHT抓取程序开源地址:https://github.com/h31h31/H31DHTDEMO 数据处理程序开源地址:https://github.com/h31h31/H31DHTMgr 国外测试 ...

  4. win8 telnet VirtualBox中的redhat9

    1. VirtualBox设置网络连接为“桥接网卡”,并且此网卡要为win8正在使用的网卡(比如我的电脑上使用的就是无线网卡,则选择网卡时也要用无线网卡) 2. 在redhat的终端里,运行ifcon ...

  5. XCode签名证书死活不能选

    Editors>Show Values on Xcode , then you can select the code sign instead of typing

  6. HDU 3974 Assign the task 暴力/线段树

    题目链接: 题目 Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...

  7. c++ 钻石继承

    在C++中,什么叫做钻石问题(也可以叫菱形继承问题),怎么避免它? 下面的图表可以用来解释钻石问题. 假设我们有类B和类C,它们都继承了相同的类A.另外我们还有类D,类D通过多重继承机制继承了类B和类 ...

  8. AlphaToCoverage solution

    After msaa output the alpha in ps remove clip in ps in blendstate add AlphaToCoverageEnable = TRUE - ...

  9. mutable关键字

    mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词.在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量(muta ...

  10. POJ 2251 Dungeon Master(广搜,三维,简单)

    题目 简单的3d广搜,做法类似与 hdu 的 胜利大逃亡 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<str ...