心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
d[i][j][k]表示共i个人站队,从前面可以看到j个人,从后面可以看到k个人的方案个数。则d[i][j][k] = d[i-1][j][k] * (i-2) + d[i-1][j-1][k] + d[i-1][j][k-1] (假设新加入的一个人身高最小),边界条件是d[1][1][1] = 1。
以下是我的代码:
#include <iostream>
using namespace std;

typedef 
long long int64;

int64 d[
17][17][17];

void Init () {
    d[
1][1][1= 1;
    
for ( int i = 2; i <= 13; i++ )
        
for ( int j = 1; j <= i; j++ )
            
for ( int k = 1; k <= i; k++ )
                d[i][j][k] 
= d[i-1][j][k] * ( i - 2 ) + d[i-1][j-1][k] + d[i-1][j][k-1];
}

int main () {
    Init ();
    
int T, n, p, r;
    cin 
>> T;
    
while ( T-- ) {
        cin 
>> n >> p >> r;
        cout 
<< d[n][p][r] << endl;
    }
    
return 0;
}


posted on 2011-11-06 10:53 lee1r 阅读(926) 评论(1)  编辑 收藏 引用 所属分类: 题目分类:数学/数论

FeedBack:
# re: UVa 10128 Queue
2012-04-19 19:12 | stryandk
我好象写复杂了……  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理