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; }