HDU 1028 Ignatius and the Princess III dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1028

一道经典题,也是算法设计与分析上的一道题,可以用递推,动态规划,母函数求解,我用的是动态规划,也就是递推的变形。

dp[i][j]表示数i的划分中最大数不超过j的划分的个数

状态转移方程:

if(j > i)
  dp[i][j] = dp[i][i];
if(j == i)
  dp[i][j] = dp[i][j - 1] + 1;
if(j < i)
  dp[i][j] = dp[i][j - 1] + dp[i - j][j];

当然前提是dp[x][1]=1

对于j<i的时候的转移方程可以这么理解:

  如果我要求dp[5][3], 那么我可以先加上dp[5][2]也就是最大数不超过2的划分;然后接下来我要加上的若干个划分每个划分中至少包括一个3,而且最大的是3,那么对于这若干个划分任意一个划分去掉3的话,就变成了5-3的最大数不超过3的划分的个数-->即有dp[5][3] = dp[5][2]+dp[2][3].

代码:

 1 #define maxn 135
 2 int dp[maxn][maxn];
 3 
 4 int dowork(int x){
 5     for(int i = 1; i <= x; i++)
 6         dp[i][1] = 1;
 7     for(int i = 1; i <= x; i++)
 8         dp[1][i] = 1;
 9     for(int i = 2; i <= x; i++){
10         for(int j = 2; j <= x; j++){
11             if(j > i) 
12                 dp[i][j] = dp[i][i];
13             if(j == i) 
14                 dp[i][j] = dp[i][j - 1] + 1;
15             if(j < i) 
16                 dp[i][j] = dp[i][j - 1] + dp[i - j][j];
17             
18             //printf("dp(%d, %d):%d ", i, j, dp[i][j]);
19         }
20         //puts("");
21     }
22     return dp[x][x];
23 }
24 
25 int main(){
26     int n;
27     while(scanf("%d", &n) != EOF){
28         memset(dp, 0, sizeof(dp));
29         printf("%d
", dowork(n));
30     }
31 } 

题目:

Ignatius and the Princess III

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 21162    Accepted Submission(s): 14776


Problem Description
"Well, it seems the first problem is too easy. I will let you know how foolish you are later." feng5166 says.

"The second problem is, given an positive integer N, we define an equation like this:
  N=a[1]+a[2]+a[3]+...+a[m];
  a[i]>0,1<=m<=N;
My question is how many different equations you can find for a given N.
For example, assume N is 4, we can find:
  4 = 4;
  4 = 3 + 1;
  4 = 2 + 2;
  4 = 2 + 1 + 1;
  4 = 1 + 1 + 1 + 1;
so the result is 5 when N is 4. Note that "4 = 3 + 1" and "4 = 1 + 3" is the same in this problem. Now, you do it!"
 
Input
The input contains several test cases. Each test case contains a positive integer N(1<=N<=120) which is mentioned above. The input is terminated by the end of file.
 
Output
For each test case, you have to output a line contains an integer P which indicate the different equations you have found.
 
Sample Input
4 10 20
 
Sample Output
5 42 627
原文地址:https://www.cnblogs.com/bolderic/p/6953131.html