HDU 1028
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1028
题意:
整数划分
思路:
设状态dp[i][j]表示数字为i,最大的组成数字为j的dp值。
然后用记忆化搜索的方法写就可以。
源码:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
#define LL long long
const int MAXN = 200;
LL dp[MAXN][MAXN];
void dfs(int u, int v)
{
if(u == v){
dp[u][v] = 1;
return;
}
if(v == 1){
dp[u][v] = 1;
return;
}
if(dp[u][v] != 0) return;
for(int i = 1 ; i <= min(u - v, v) ; i++){
dfs(u - v, i);
dp[u][v] += dp[u - v][i];
}
}
void init()
{
memset(dp, 0, sizeof(dp));
for(int i = 1 ; i < MAXN ; i++){
for(int j = 1 ; j <= i ; j++)
dfs(i, j);
}
}
int main()
{
init();
int n;
while(scanf("%d", &n) != EOF){
LL ans = 0;
for(int i = 1 ; i <= n ; i++)
ans += dp[n][i];
printf("%I64d\n", ans);
}
return 0;
}