zoukankan      html  css  js  c++  java
  • hdu 1028 Ignatius and the Princess III

    Ignatius and the Princess III

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


    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
     
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 int main(void){
     6 #ifndef ONLINE_JUDGE
     7   freopen("1028.in", "r", stdin);
     8 #endif
     9   int dp[121][121];
    10   memset(dp, 0, sizeof(dp)); 
    11   for (int i = 0; i < 121; ++i){
    12     dp[i][1] = dp[1][i] = 1;
    13   }
    14   for (int i = 2; i < 121; ++i){
    15     for (int j = 2; j < 121; ++j){
    16       if (i < j) dp[i][j] = dp[i][i];
    17       else if (i == j) dp[i][j] = 1 + dp[i][j-1];
    18       else dp[i][j] = dp[i][j-1] + dp[i-j][j];
    19     }
    20   }
    21   int n; 
    22   while (~scanf("%d", &n)){
    23     printf("%d\n", dp[n][n]);
    24   }
    25   return 0;
    26 }

    突然感觉动态规划特别有意思……

    这道题目也可以用母函数做,可惜看了一下,没有看懂……

    dp[i][j] 表示把整数i用不大于j的正整数之和表示.

    分三种情况:

    当i》j的时候,如果选j,那么有dp[i-j][j]种;如果不选j,那么有dp[i][j-1]种;

    当i==j的时候,如果选j,那么有1种;如果不选j,那么又dp[i][j-1]种;

    当i《j的时候,则dp[i][j] = dp[i][i];

    然后,显然,当i或者j其中一个等于1的时候,结果都是1.

    求n的划分,就是求把整数n用不大于n的正整数之和表示,有几种方法,就是dp[n][n]。

  • 相关阅读:
    Altium Designer 16 问题解决
    IAR FOR AVR 仿真过程中出现全局变量值不断随意变化的问题
    linux '--stdin'错误 -批量修改密码
    EmWin 字体相关函数
    EmWin 文本显示函数
    Win10下 usart驱动PL2303无法安装的问题
    EmWin 接触---基础函数
    Linux 下 Samba 服务器搭建
    MPLAB X IDE V4.15 创建工程,编译,问题处理
    EF Core MVC
  • 原文地址:https://www.cnblogs.com/liuxueyang/p/2958274.html
Copyright © 2011-2022 走看看