Hatena::Grouptopcoder

kojingharangの日記 RSSフィード

 | 

2011-12-29

SRM 363 Div1 easy HandsShaking

14:49 |  SRM 363 Div1 easy HandsShaking - kojingharangの日記 を含むブックマーク はてなブックマーク -  SRM 363 Div1 easy HandsShaking - kojingharangの日記  SRM 363 Div1 easy HandsShaking - kojingharangの日記 のブックマークコメント

社畜ビジネスマンが N 人円卓に座って、腕が交差しないように全員が握手する方法は何通りあるか。

  • f(n-k) から f(n) が作れないかいろいろ試行錯誤
  • ....
  • ....
  • 一組握手してしまえば、その左右は独立した領域になるので、f(n)=Σf(左の人数)*f(右の人数) で良さそう
  • それをメモ化。


ll memo[60];
ll f(int n) {
	ll ans = 0;
	if(n==0) return 1;
	if(memo[n]) return memo[n];
	for(int i=0;i<=n-2;i+=2) {
		int j=n-2-i;
		ans+=f(i)*f(j);
	}
	return memo[n]=ans;
}

class HandsShaking {
	public:
	long long countPerfect(int n) {
		memset(memo, 0, sizeof(memo));
		return f(n);
	}

成功体験++

 |