URAL 1009

来源:互联网 发布:北京大学金融学知乎 编辑:程序博客网 时间:2024/05/21 06:46

这道题是这一系列里最简单的= =

简单来说,这里要一位一位的判断,因为数字分成两种:0,后面必须跟非零;非零,后面都可以。

所以用1来表示非零数,按照规则动归或回溯。


#include<stdio.h>int n,k;int sum=0;void zhixing(int i,int *a,int dum){if(i==n){sum+=dum;return;}if(a[i-1]){a[i]=1;zhixing(i+1,a,dum*(k-1));a[i]=0;zhixing(i+1,a,dum);}else{a[i]=1;zhixing(i+1,a,dum*(k-1));}}int main(void){scanf("%d%d",&n,&k);int a[20];int i,j;a[0]=1;zhixing(1,a,k-1);printf("%d\n",sum);return 0;}
动归短得多

#include <stdio.h>#include <math.h>long long dp[20][2];int main(){    int N,K,i;    scanf("%d%d",&N,&K);    dp[1][0]=0; dp[1][1]=K-1;    for(i=2; i<=N; i++)    {        dp[i][1]+=(K-1)*(dp[i-1][1]+dp[i-1][0]);        dp[i][0]=dp[i-1][1];    }    printf("%lld\n",dp[N][1]+dp[N][0]);        return 0;}



0 0
原创粉丝点击