| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1327 人关注过本帖
标题:K好数,求大神用正确的动态规划实现,
只看楼主 加入收藏
loveClangage
Rank: 8Rank: 8
来 自:广东云浮
等 级:蝙蝠侠
帖 子:326
专家分:891
注 册:2013-8-23
结帖率:100%
收藏
已结贴  问题点数:100 回复次数:10 
K好数,求大神用正确的动态规划实现,

如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。例如K = 4,L = 2的时候,所有K好数为11、13、20、22、30、31、33 共7个。由于这个数目很大,请你输出它对1000000007取模后的值。

输入格式


输入包含两个正整数,K和L。

输出格式

输出一个整数,表示答案对1000000007取模后的值。

样例输入

4 2

样例输出

7

数据规模与约定


对于30%的数据,KL <= 106;

对于50%的数据,K <= 16, L <= 10;

对于100%的数据,1 <= K,L <= 100。
本人也做了,但行不通,时间太长,效
程序代码:
#include <stdio.h>
#include <stdlib.h>
static int N1=0;
static int N2=1;
int jude(int n[],int wei)
{
    int jude2(int n[],int n1,int n2,int wei);
    if(wei==1)
    return 0;
    if(wei==2)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
        return 1;
    }
    if(wei==3)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          return 1;
    }
    if(wei==4)
    {
   
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          return 1;
    }
    if(wei==5)
    {
           
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          return 1;
    }
    if(wei==6)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          return 1;
    }
    if(wei==7)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          if((n[5]+1!=n[6])&&(n[5]-1!=n[6]))
          return 1;    
    }
    if(wei==8)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          if((n[5]+1!=n[6])&&(n[5]-1!=n[6]))
          if((n[6]+1!=n[7])&&(n[6]-1!=n[7]))
          return 1;
    }
    if(wei==9)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          if((n[5]+1!=n[6])&&(n[5]-1!=n[6]))
          if((n[6]+1!=n[7])&&(n[6]-1!=n[7]))
          if((n[7]+1!=n[8])&&(n[7]-1!=n[8]))
          return 1;
    }
    if(wei==10)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          if((n[5]+1!=n[6])&&(n[5]-1!=n[6]))
          if((n[6]+1!=n[7])&&(n[6]-1!=n[7]))
          if((n[7]+1!=n[8])&&(n[7]-1!=n[8]))
          if((n[8]+1!=n[9])&&(n[8]-1!=n[9]))
          return 1;
    }
    if(wei==11)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          if((n[5]+1!=n[6])&&(n[5]-1!=n[6]))
          if((n[6]+1!=n[7])&&(n[6]-1!=n[7]))
          if((n[7]+1!=n[8])&&(n[7]-1!=n[8]))
          if((n[8]+1!=n[9])&&(n[8]-1!=n[9]))
          if((n[9]+1!=n[10])&&(n[9]-1!=n[10]))
          return 1;
    }
    if(wei==12)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          if((n[5]+1!=n[6])&&(n[5]-1!=n[6]))
          if((n[6]+1!=n[7])&&(n[6]-1!=n[7]))
          if((n[7]+1!=n[8])&&(n[7]-1!=n[8]))
          if((n[8]+1!=n[9])&&(n[8]-1!=n[9]))
          if((n[9]+1!=n[10])&&(n[9]-1!=n[10]))
          if((n[10]+1!=n[11])&&(n[10]-1!=n[11]))
          return 1;
    }
    if(wei==13)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          if((n[5]+1!=n[6])&&(n[5]-1!=n[6]))
          if((n[6]+1!=n[7])&&(n[6]-1!=n[7]))
          if((n[7]+1!=n[8])&&(n[7]-1!=n[8]))
          if((n[8]+1!=n[9])&&(n[8]-1!=n[9]))
          if((n[9]+1!=n[10])&&(n[9]-1!=n[10]))
          if((n[10]+1!=n[11])&&(n[10]-1!=n[11]))
          if((n[11]+1!=n[12])&&(n[11]-1!=n[12]))
          return 1;
    }
    if(wei==14)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          if((n[5]+1!=n[6])&&(n[5]-1!=n[6]))
          if((n[6]+1!=n[7])&&(n[6]-1!=n[7]))
          if((n[7]+1!=n[8])&&(n[7]-1!=n[8]))
          if((n[8]+1!=n[9])&&(n[8]-1!=n[9]))
          if((n[9]+1!=n[10])&&(n[9]-1!=n[10]))
          if((n[10]+1!=n[11])&&(n[10]-1!=n[11]))
          if((n[11]+1!=n[12])&&(n[11]-1!=n[12]))
          if((n[12]+1!=n[13])&&(n[12]-1!=n[13]))
          return 1;
    }
    if(wei==15)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          if((n[5]+1!=n[6])&&(n[5]-1!=n[6]))
          if((n[6]+1!=n[7])&&(n[6]-1!=n[7]))
          if((n[7]+1!=n[8])&&(n[7]-1!=n[8]))
          if((n[8]+1!=n[9])&&(n[8]-1!=n[9]))
          if((n[9]+1!=n[10])&&(n[9]-1!=n[10]))
          if((n[10]+1!=n[11])&&(n[10]-1!=n[11]))
          if((n[11]+1!=n[12])&&(n[11]-1!=n[12]))
          if((n[12]+1!=n[13])&&(n[12]-1!=n[13]))
          if((n[13]+1!=n[14])&&(n[13]-1!=n[14]))
          return 1;
    }
    if(wei==16)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          if((n[5]+1!=n[6])&&(n[5]-1!=n[6]))
          if((n[6]+1!=n[7])&&(n[6]-1!=n[7]))
          if((n[7]+1!=n[8])&&(n[7]-1!=n[8]))
          if((n[8]+1!=n[9])&&(n[8]-1!=n[9]))
          if((n[9]+1!=n[10])&&(n[9]-1!=n[10]))
          if((n[10]+1!=n[11])&&(n[10]-1!=n[11]))
          if((n[11]+1!=n[12])&&(n[11]-1!=n[12]))
          if((n[12]+1!=n[13])&&(n[12]-1!=n[13]))
          if((n[13]+1!=n[14])&&(n[13]-1!=n[14]))
          if((n[14]+1!=n[15])&&(n[14]-1!=n[15]))
          return 1;
    }
    if(wei>=2)
    {
        if(jude2(n,N1,N2,wei)==1)
         return 1;
    }
    return 0;
}
int jude2(int n[],int n1,int n2,int wei)
{
    if((n[n1]+1!=n[n2])&&(n[n1]-1!=n[n2])&&n2<=wei)
      {
        jude2(n,N1+=1,N2+=1,wei);
        return 1;
         }
       return 0;
}
void jinzi(int n[],int k,int ge,int shi)
{
    n[shi]+=1;
    n[ge]=0;
    if(n[shi]==k&&shi>0)
    jinzi(n,k,ge-=1,shi-=1);
}
int leave(int n[],int n1,int n2,int k,int wei)
{
    if((n[n1]==k-1)&&n[n2]==k-1&&n2<wei)
      {
        leave(n,n1+=1,n2+=1,k,wei);
        return 1;
         }
       return 0;
}
int trans(int k,int wei)
{
    int number=0;
    if(k<=2)
    return 0;
    int N[100];
    int f1,f2;
    N[0]=1;
    for(f1=1;f1<wei;f1++)
    {
        N[f1]=0;
    }
    while(1)
    {
        N[wei-1]++;
        if(N[wei-1]==k)
         jinzi(N,k,wei-1,wei-2);
        if(jude(N,wei)==1)
         number++;
        if(leave(N,0,1,k,wei)==1)
         break;
    }
    return number%1000000007;
}
int main(int argc, char *argv[]) {
    int k,l,j;
    scanf("%d%d",&k,&l);
    printf("%d",trans(k,l));
    scanf("%d",&j);
    return 0;
}
率低,在OJ上得10分,
代码如下,求大神出更好的代码,
搜索更多相关主题的帖子: 自然数 正整数 动态 规模 
2014-02-24 21:44
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
总觉得见过这个问题。
程序代码:
#include <stdio.h>

#define LEN    128
#define M    1000000007

int cal(int K, int L)
{
    int a[2][LEN], *f = a[0], *p = a[1], *t, i, j, h;
    
    for(i = 0; i < K; f[i++] = 1);
    
    for(i = 1; i < L; i++, t = f, f = p, p = t)
    for(j = 0; j < K; j++)
    for(p[j] = h = 0; h < K; h++)
        p[j] = (p[j] + (abs(j - h) == 1 ? 0 : f[h])) % M;
    
    for(h = 0, i = 1; i < K; h += f[i++]);
    
    return h;
}

int main()
{
    int K, L;
    scanf("%d%d", &K, &L);
    printf("%d\n", cal(K, L));
    return 0;
}

重剑无锋,大巧不工
2014-02-24 23:03
书生等待
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:280
专家分:689
注 册:2013-2-22
收藏
得分:0 
回复 2楼 beyondyf
版主能否稍微解释一下思路,这样程序才能读懂啊,,照顾下小白啦
2014-02-25 20:25
loveClangage
Rank: 8Rank: 8
来 自:广东云浮
等 级:蝙蝠侠
帖 子:326
专家分:891
注 册:2013-8-23
收藏
得分:0 
回复 2楼 beyondyf
谢谢版主热心指导,我复制你的代码,到OJ上得30分哦,我看不懂你的程序,你看看还有什么问题吧。。

编写的程序,不能改变世界,却可以改变自己...
2014-02-25 20:48
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
我了个去 我编了一个 那个 4 2 7 的结果是正确的。。。 不过其他的就不知道了 。。。。
程序代码:
// K好数,求大神用正确的动态规划实现,
// 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,
// 那么我们就说这个数是K好数。求L位K进制数中K好数的数目。 
// 例如K = 4,L = 2的时候,所有K好数为11、13、20、22、30、31、33 共7个。 
// 由于这个数目很大,请你输出它对1000000007取模后的值。

// 输入格式
// 输入包含两个正整数,K和L。
// 输出格式
// 输出一个整数,表示答案对1000000007取模后的值。 
// 样例输入
// 4 2 
// 样例输出
// 7 
// 数据规模与约定
// 对于30%的数据,KL <= 106;
// 对于50%的数据,K <= 16, L <= 10;
// 对于100%的数据,1 <= K,L <= 100。


#include <stdio.h>
#include <math.h>

void main()
{
    int       K = 0;      // K变量代表进制 
    int       L = 0;      // L变量代表数字位数
    int       a[17];      // 用a数组的每个元素代表数字的每一位,a[0]不使用
    int       i = 0;      // 计数变量
    long      s = 0;    // 记录K好数个数变量
    int x; // 临时变量
    int y; // 临时变量

    a[0] = 0;
    a[1] = 1;
    for (; !((K <= 16) && (K >= 1) && (L <= 10) && (L >= 2)); )
    {               // 该for循环用来数据输入
        printf("\n请输入要求K好数的数字进制K:\n");
        scanf("%d", &K);
        printf("\n请输入要求K好数的数字位数L:\n");
        scanf("%d", &L);
    }
    for (i = 2; i <= 16; i++)
    {               // 初始化数组
        a[i] = 0;
    }

    x = 2;
    for (;;) // 结束标志暂时不知道!!!!!
    {
        for (x = 2; x <= L; x++)
        {
            if (abs(a[x]-a[x-1]) == 1)
            {
                if (K - 1 == a[x])
                {
                    for (y = x; K - 1 == a[y]; y--)
                    {    // 考虑到  ... K-1,K-1,K-1,...情况,这个循环找到最终进位(+1的进位)或者结束
                        if (1 == y)
                        {
                            goto end;  // 这是结束标志
                        }
                    }
                }
                else
                {
                    y = x;
                }
                a[y] = a[y] + 1;
                for (i = y + 1; i <= L; i++)
                {    // 某位发生变化 后面的位数全部置零,置零为了从新算起,不漏算
                    a[i] = 0;
                }
                x = y;
            }
        }
        if (L + 1 == x)          // 该选择结构进行时,表示上个循环结构进行到底,也就是此时是个K好数
        {                        // s加1后 这个数(a数组)最低位加1
            x = x - 1;   // 把x改为指向最后一位
            s = s + 1;
            if (K - 1 == a[x])
            {
                for (y = x; K - 1 == a[y]; y--)
                {    // 考虑到  ... K-1,K-1,K-1,...情况,这个循环找到最终进位(+1的进位)或者结束
                    if (1 == y)
                    {
                        goto end;  // 这是结束标志
                    }
                }
                a[y] = a[y] + 1;
                for (i = y + 1; i <= L; i++)
                {    // 某位发生变化前,该位后面都是K-1,加1后,后面的全部置零,该位被进1位
                    a[i] = 0;
                }
            }
            else
            {
                a[x] = a[x] + 1;
            }
        }
    } // for(;;) 循环结束
end: printf("\n%d位的%d进制的K好数个数是%d。\n", L, K, s);
}



// K好数最小的应该是 1,1,1 ... 1,1
// K好数最大应该是 K-1,K-1,K-1 ... K-1,K-1 
// 数字很大的没法验证了 啊 啊 啊。。。


顺便想问下楼主,这些题你是哪里找到了呀

未知令人期待!
2014-02-25 21:55
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
还有 最后木有取模

未知令人期待!
2014-02-25 21:57
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:100 
以下是引用loveClangage在2014-2-25 20:48:16的发言:

谢谢版主热心指导,我复制你的代码,到OJ上得30分哦,我看不懂你的程序,你看看还有什么问题吧。。

只知道AC与否,还没见过打分的OJ。30分意味着什么?

又是个内网OJ?如果能从外网登录麻烦你告诉我这题的地址。

重剑无锋,大巧不工
2014-02-25 22:21
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
又看了下我的代码,确实有问题,输出前忘了取模。

把cal函数中最后一个循环的迭代部分改成h=(h+f[i++])%M

重剑无锋,大巧不工
2014-02-25 22:42
loveClangage
Rank: 8Rank: 8
来 自:广东云浮
等 级:蝙蝠侠
帖 子:326
专家分:891
注 册:2013-8-23
收藏
得分:0 
回复 7楼 beyondyf
就是有些数据跑不过吧,提示错误,我告诉你内网我的帐号吧,你去看看吧,谢谢,http://lx.

编写的程序,不能改变世界,却可以改变自己...
2014-02-25 22:43
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
觉得见过这个问题。
2014-02-25 22:48
快速回复:K好数,求大神用正确的动态规划实现,
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.081689 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved