HDU 1028 整数分化

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

你可能感兴趣的:(HDU 1028 整数分化)