hdu 2048 神、上帝以及老天爷 动态规划

分析:题目意思其实就是输出错排数除以总数。而总数就是n!。设i个数的错排数为f[i],若前面i-1个人都满足错排,那么第i个人和其他任意i-1个人交换后也满足错排。还有一种情况就是若前i-1个人中恰好有一个人不满足错排而其他人都满足,那么第i个人与那个自己的票的人交换后也能满足错排。所以f[i]=f[i-1]*(i-1)+f[i-2]*(i-1)。

代码:

var
  s,f:array[1..20] of int64;
  i,n,x:longint;
begin
  f[2]:=1;
  s[1]:=1;
  s[2]:=2;
  for i:=3 to 20 do
  begin
    f[i]:=f[i-1]*(i-1)+f[i-2]*(i-1);
    s[i]:=s[i-1]*i;
  end;
  readln(n);
  for i:=1 to n do
  begin
    readln(x);
    writeln(f[x]/s[x]*100:0:2,'%');
  end;
end.


你可能感兴趣的:(hdu 2048 神、上帝以及老天爷 动态规划)