学习心得(code)

superlong@CoreCoder

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  74 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

公告

文字可能放在http://blog.csdn.net/superlong100,此处存放代码

常用链接

留言簿(4)

我参与的团队

搜索

  •  

最新随笔

最新评论

  • 1. re: Poj 1279
  • 对于一个凹多边形用叉积计算面积 后能根据结果的正负来判断给的点集的时针方向?
  • --bsshanghai
  • 2. re: Poj 3691
  • 你写的这个get_fail() 好像并是真正的get_fail,也是说fail指向的串并不是当前结点的子串。为什么要这样弄呢?
  • --acmer1183
  • 3. re: HDU2295[未登录]
  • 这个是IDA* 也就是迭代加深@ylfdrib
  • --superlong
  • 4. re: HDU2295
  • 评论内容较长,点击标题查看
  • --ylfdrib
  • 5. re: HOJ 11482
  • 呵呵..把代码发在这里很不错..以后我也试试...百度的编辑器太烂了....
  • --csuft1

阅读排行榜

评论排行榜

#include <iostream>
#include 
<string.h>
using namespace std;
typedef __int64 dp_arr;

int     n;
__int64 m;
dp_arr     f[
21][21][2];//0:up 1:down

void read()
{scanf(
"%d %I64d"&n, &m);}

__int64 dp(
int pos, int len, int inc)
{
    
if(pos == 1 && inc)  return 0;
    
if(len == 1)         return 1;
    
int k;
    __int64 t, sum 
= 0;
    
if(inc)
    {
        t 
= 0;
        
if(f[pos - 1][len][1]) t = f[pos - 1][len][1];
        
else                   t = f[pos - 1][len][1= dp(pos - 1, len, 1);
        sum 
+= t;
        
if(f[pos - 1][len - 1][0])  t = f[pos - 1][len - 1][0];
        
else                           t = f[pos - 1][len - 1][0= dp(pos - 1, len - 10);
        sum 
+= t;
    }
    
else
    {
        
if(f[len + 1 - pos][len][1])  t = f[len + 1 - pos][len][1];
        
else                           t = f[len + 1 - pos][len][1= dp(len + 1 - pos, len, 1);
        sum 
= t;
    }
    
return sum;
}

void solve(int n,__int64 re)
{
    
int  i, j, pos, dic;
    
int set[21];
    
for(i = 1; i <= n; i ++set[i] = i;
    
for(i = n; i >= 1-- i)
    {
        
if(i == n)
        {          
//单独处理 
            for(j = 1; j <= i; ++ j)
            {
                
if(re - f[j][i][1<= 0) { pos = j; dic = 1break; }
                
else re -= f[j][i][1];
                
if(re - f[j][i][0<= 0) { pos = j; dic = 0break; }
                
else re -= f[j][i][0];
            }
            printf(
"%d",set[pos]);
            
for(j = pos; j <= i; j ++set[j] = set[j + 1];
        }
        
else
        {
            
if(dic == 1)
            {
                
for(j = 1; j < pos; ++ j)
                {
                    
if(re - f[j][i][0<= 0) { pos = j; dic = 0break;}
                    re 
-= f[j][i][0];
                }
                printf(
" %d",set[pos]);
                
for(j = pos; j <= i; j ++set[j] = set[j + 1];
            }
            
else
            {
                
for(j = pos; j <= i; ++ j)
                {
                    
if(re - f[j][i][1<= 0) { pos = j; dic = 1break; }
                    re 
-= f[j][i][1];
                }
                printf(
" %d"set[pos]);
                
for(j = pos; j <= i; j ++set[j] = set[j + 1];
            }
        }
    }
    printf(
"\n");
}

int main()
{
    
int test;
    freopen(
"in.txt","r",stdin);
    scanf(
"%d"&test);
    
while(test --)
    {
        read();
        memset(f, 
0sizeof(f));
        
for(int i = 1; i <= n; ++ i)
        {
            f[i][n][
0= dp(i, n, 0);
            f[i][n][
1= dp(i, n, 1);
        }        
        solve(n, m);
    }
    
while(1);
}

posted on 2009-09-07 17:04 superlong 阅读(1026) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理