Power oj 3132:恰巧K步的方案数

 
一道走楼梯的改编题,题目大意就是从1走到N,在位置i时,可以走的步数是1、2、… 一直到i,求走到N是恰好是k步的方案数是多少?
这道题要注意两个点
一:本题是多组输入,求一组的时间复杂度是O(n*k),大概就是1e7,几十组样例就T了。
       这种情况要往预处理方向想,把dp[N][k]先全求出来,之后就可以读入一个输出一个。
二:本题的状态转移方程是
  dp[i][j]=dp[i-1][j]+dp[i-1][j-1];//i%2==0
  dp[i][j]=dp[i-1][j]-dp[(i-1)/2][j-1]+dp[i-1][j-1]//i%2==1

       当i%2==1时,状态转移公式里有减号,如果不处理的话会出现负数。

 

AC代码如下

复制代码
#include<bits/stdc++.h>

using namespace std;
#define int  long long

const int mod=1e9+7;
const int N=2e5+10;

int n,m,k;

int dp[10010][1010];

void init(int n,int k)
{
    dp[1][0]=1;
    for(int i=2;i<=n;i++)
        for(int j=1;j<=k&&j<=i-1;j++)
        {
            if(i%2==0)
                dp[i][j]=(dp[i-1][j]+dp[i-1][j-1])%mod;
            else
                dp[i][j]=(((dp[i-1][j]-dp[(i-1)/2][j-1])%mod+mod)%mod+dp[i-1][j-1])%mod;
        }
}
signed main()
{

    init(10000,1000);

    while(scanf("%lld%lld",&n,&k)!=EOF)
    {

        if(pow(2,k)<n)
            printf("0\n");
        else
            printf("%lld\n",dp[n][k]);
    }
    return 0;
}
复制代码

 

 

 2022-08-02

posted @   wangwei0134  阅读(164)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示