首页 > 其他 > 详细

刷题总结——pole(uva 1638 dp)

时间:2017-10-23 20:41:27      阅读:226      评论:0      收藏:0      [点我收藏+]

题目:

技术分享

题解:

  这道题很妙的一点是很好地利用了最矮的杆子除了放两侧以外对观察数是没有影响的性质··

  考虑n-1个杆子与n个杆子··我们可以把n个杆子的排列看成n-1个杆子的长度加1按原来的排列顺序··然后往其中加入一个长度为1的杆子··

  所以分长度为1的杆子放左右两边和放中间三种情况转移即可···

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<string>
#include<cstring>
#include<algorithm> 
using namespace std;    
long long f[205][205][205];  
int n,l,r;
const long long mod=998244353;
inline int R()
{
  char c;int f=0;
  for(c=getchar();c<0||c>9;c=getchar());
  for(;c<=9&&c>=0;c=getchar())  f=(f<<3)+(f<<1)+c-0;
  return f;
}  
inline void pre()  
{  
  f[1][1][1]=1;  
  for(int i=2;i<=200;i++)  
    for(int j=1;j<=i;j++)  
      for(int k=1;k<=i;k++)  
        if(j+k>=3&&j+k<=i+1)  
          f[i][j][k]=((f[i-1][j-1][k]+f[i-1][j][k-1])%mod+f[i-1][j][k]*(i-2)%mod)%mod;  
}  
  
int main()  
{  
  //freopen("pole.in","r",stdin);
  freopen("pole.out","w",stdout);
  pre();  
  int T;T=R();
  while(T--)  
  {  
    n=R(),l=R(),r=R();
    cout<<f[n][l][r]<<endl; 
  }  
  return 0;  
} 

 

刷题总结——pole(uva 1638 dp)

原文:http://www.cnblogs.com/AseanA/p/7718633.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!