nyoj 708 ones

題目鏈接:http://acm.nyist.net/JudgeOnline/problem.php?pid=708

大意是,給一個數n,然後讓你使用1,+,*,(,);組成表達式,使其值爲n,問最少需要多少個1;

////////////////////////////

簡單的DP

設f[i]爲表達式值爲i的時候最少要用的1的數目

則f[i]可以有 f[i-j]和 f[j]推出 此時i爲j+(i-j)  也可以由f[j]和f[i/j]推出 此時i須爲j的倍數  此時i爲j*(i/j);

所以要分情況 取兩者最小,但是如果爲j*(i-j)的時候j不能爲1,因爲此時i/j爲i f[i]的結果還未得出;

具體代碼如下:

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int f[10005];
void init()
{
	f[1]=1;
	f[2]=2;
	for(int i=3;i<=10000;++i)
	{
		for(int j=1;j<i;++j)
		{
			int t=f[j]+f[i-j];
			if(j!=1&&i%j==0&&(f[j]+f[i/j])<t)
				t=f[j]+f[i/j];
			if(f[i]>t||!f[i])
				f[i]=t;
				
		}
	}
}
int main()
{
	int n;
	init();
	while(cin>>n)
		cout<<f[n]<<endl;
	return 0;
}


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