题目:
题目描述
给出一个数字表{0,1,2,---,k},1≤k≤9。可以用这个数字表构造出长度为n的数,如果所构造的这个数的任意两个相邻的数字差都不超过1,则称这个数为该数字表上的n紧凑数。如k=9,101010就是一个长度为6的紧密数。可以认为010101也是一个长度为6的紧密数。
输入输出格式
输入格式:
测试数据有多组。 每组一行包含两个整数k和n,之间用一个空格隔开。
输出格式:
对输入的每一行,输出一个实数,表示长度为n的所有数中,紧密数所占的 百分比,保留小数点后5位。
输入输出样例
输入样例#1:
4 1
2 5
3 5
8 7
输出样例#1:
100.00000
40.74074
17.38281
0.10130
说明
1≤n≤100
思路:
f[i][j]表示i位数以j结尾的紧密数个数。
f[i][j]=f[i-1][j-1]+f[i][j]+f[i][j+1]。
注意:不能把f[i][j]一开始就设成百分比,容易被卡精度。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 100
#define maxk 10
int k,n;
double f[maxn+5][maxk+5];
void init() {
memset(f,0,sizeof(f));
for(int i=0; i<=k; i++) f[1][i]=1;
}
void dp(){
for(int i=2;i<=n;i++){
for(int j=0;j<=k;j++){
if(j-1>=0) f[i][j]+=f[i-1][j-1];
f[i][j]+=f[i-1][j]+f[i-1][j+1];
}
}
}
void print(){
double ans=0;
for(int i=0;i<=k;i++) ans+=f[n][i];
for(int i=1;i<=n;i++) ans/=(k+1);
printf("%.5lf\n",ans*100);
}
int main() {
while(~scanf("%d%d",&k,&n)) {
init();
dp();
print();
}
return 0;
}