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. google api , the problem of null refresh token

    http://stackoverflow.com/questions/10827920/google-oauth-refresh-token-is-not-being-received The ref ...

  2. GitHub error “Failed to get HEAD”

    cd /要提交的文件的文件夹下    比如要提交一个名为  demo的  程序, 那么先进入demo 的文件夹里面  然后  进行以下两步 git init  (有时这个是不必要的,因为xcode 自 ...

  3. Eclipse 项目管理控制软件svn

    ^_^太开心了,之前以为eclipse只有tortoiseSVN而没有类似Visual Studio 2010里面的cvs的版本控制软件,不是我讨厌tortoiseSVN,而是我实在不习惯使用这个软件 ...

  4. 高德开发 android 出现 key 鉴权失败

    环境windows + android studio 原因: 曾经更改过key.store 解决办法: 首先运行cmd移动到keystore的目录下keytool -list -keystore 文件 ...

  5. java集合类(二)List学习

    接上篇  java集合类(一) List接口继承了Collection接口和Iterable接口,即同样含有Collection和 Iterable的特性,还有方法,其基本方法有: 1)有关添加: b ...

  6. UML类图关系大全-转

    1.关联 双向关联: C1-C2:指双方都知道对方的存在,都可以调用对方的公共属性和方法. 在GOF的设计模式书上是这样描述的:虽然在分析阶段这种关系是适用的,但我们觉得它对于描述设计模式内的类关系来 ...

  7. 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

    // test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  8. CF Gym100548 K Last Defence 解题报告

    先特判掉特殊情况: $a=b,Ans=2$ $ab=0,a+b>0,Ans=2$ $a=b=0,Ans=1$ 考虑剩下的非特殊情况.记$Solve(a,b)$为数列中除了$a,b$外的不同的数的 ...

  9. Unity3D脚本中文系列教程(七)

    http://dong2008hong.blog.163.com/blog/static/4696882720140311445677/?suggestedreading&wumii Unit ...

  10. call,apply,bind方法的总结

    why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之前,通常会有这些问题. var a = { user:"追梦子", fn:f ...