TOJ 1509


題目連接:

http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1509


題目類型:

動態規劃


數據結構:


思路分析:

-------------------------------------------------------------------------------------

分治思路
在M的時間,讓蟲子從P位置到T位置
可以分解爲在M-1的時間,讓蟲子從P到T-1和T+1位置.(如果T在邊緣,則取其一)
問題可以分解到 當M=1時,從P到P+1,或者P-1位置的走法,得數爲1.
利用迭代將答案相加即可.

-------------------------------------------------------------------------------------
動態規劃思路
利用分治算法,假如K時刻在N位置,需要求得K-1時刻在N-1和N+1位置的情況.
難免N-1跟N+1 其中有幾步是會重複,比如在T時刻 N+1,N-1 共同對應 T-1時刻的 N.
這裏會耗費不少的務必要時間.
換個思路從M=0開始向上迭代.
每一步的走法情況等於前一秒旁邊位置情況的和.
這裏每一步要求的數據都是新的,數據來源則可以從M-1直接獲得.
所以不存在重複求同一問題的情況 省去大量時間.


證明:


源代碼:

#include <iostream>
#include <stdio.h>
using namespace std;

int main()
{
	int i,j,n,p,m,t;
	int ans[101][101]={0};
	
	while(scanf("%d%d%d%d",&n,&p,&m,&t)!=EOF)
	{
		memset(ans,0,sizeof(ans));
		ans[p][0]=1;
		
		for(i=0;i<=m;i++)
		for(j=1;j<=n;j++)
			if(ans[j][i]!=0)
			{
				ans[j-1][i+1]+=ans[j][i];
				ans[j+1][i+1]+=ans[j][i];
			}
		
		printf("%d\n",ans[t][m]);
	}
	
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章