nyoj 708 ones 動態規劃

http://acm.nyist.net/JudgeOnline/problem.php?pid=708php

狀態轉移方程的思路:對於一個數N,能夠是N - 1的狀態+1 獲得,另外,也能夠是(n / 2) * (1 + 1)獲得,同理對於任意的奇數p,都有若是n能夠整除p,都有f(n / p) + f(p).net

 
#include<stdio.h>
int dp[10010];
bool isprime[101];
int prime[101];
int total;
void sol()
{
	int i;
	for(i = 4; i < 10010; i++)
	{
		int min = dp[i - 1] + 1;
		int j;
		for(j = 0; prime[j] < i && j < total; j ++)
		{
			if(i % prime[j] == 0)
			{
				min = min < (dp[i / prime[j]] + dp[prime[j]]) ? min : dp[i / prime[j]] + dp[prime[j]];
			}
		}
		dp[i] = min;
	}
}
int main()
{
	int n;
	dp[1] = 1;
	dp[2] = 2;
	dp[3] = 3;
	int i, j;
	for(i = 2; i * i < 100; i++)
	{
		if(isprime[i] == 0)
		{
			for(j = i + i; j < 100; j+= i)
			{
				isprime[j] = 1;
			}
		}
	}
	for(i = 2; i < 100; i++)
	{
		if(isprime[i] == 0)
			prime[total ++] = i;
	}
	sol();
	while(scanf("%d",&n) != EOF)
	{
		printf("%d\n", dp[n]);
	}
	return 0;
}        
相關文章
相關標籤/搜索