poj 3597

题意:将一个多边形分成由三角形或四边形或由两者组成的划分方法。

刚看到图案都以为是卡特兰数,看完之后不是,当时仙茂神牛去推了,可惜我们一直不支持开这题,也就他一个人在做,不过也是,因为要mod2^64,就想到了高精度,感觉挺复杂的,回来看题解,这题还真不好写,那个组合问题可能还好想,那一步优化我打死都想不出来,这要对数字很有感觉才行,还有那个mod用unsigned也想不到,那一步优化才是重点,消掉了一个变量,就少了一个for,这题很有意思啊,一下子给了我很多思维方法,有时候在不能优化的时候看看能不能带入消元,好像以前林教讲过一题期望也是消元思想,还有问题的从小问题推到大问题,这种相当于dp的思想也很重要,讲到dp,要经常去看以前题目状态的设定,经常想为什么会这样设定,可不可以用其他状态取的更优的效率。这题就不讲了,这个题解http://blog.sina.com.cn/s/blog_64675f540100hgvt.html很详细,但是就是+号没有显示出来,看的时候自己加上去。

Run ID User Problem Result Memory Time Language Code Length Submit Time
9253488 201030720425 3597 Accepted 376K 282MS C++ 594B 2011-08-29 23:27:07
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
unsigned long long x[50005];
unsigned long long y[50005];
unsigned long long z[50005];
void init()
{
	y[3]=x[3]=x[2]=x[1]=x[0]=1;
	for(int i=4;i<=5000;i++)
	{
		x[i]=0;
		for(int j=2;j<i;j++)
		{
			y[i]+=x[j]*x[i-j+1];
		}
		for(int j=2;j<i-1;j++)
		{
			z[i]+=x[j]*y[i-j+1];
		}
		x[i]=y[i]+z[i];
	}
}
int main()
{
	init();
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		cout<<x[n]<<'\n';
	}
	return 0;
}


你可能感兴趣的:(优化,2010)