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]。

  • 相关阅读:
    淘宝技术这十年(淘宝技术大学校长解密淘宝十年)
    Go Web编程(Go语言性能好、语法简单、开发效率高!)
    辨别虚假流量的十二种方法
    收获,不止Oracle(顶级专家盖国强、冯春培、黄志洪等联袂力荐)
    演说之禅:职场必知的幻灯片秘技(第2版)(全彩)
    篮球词汇(转)
    Xilinx 网站资源导读
    乔布斯2005年在斯坦福毕业典礼的演讲稿
    FPGA中BRAM初始化文件格式的总结_ALTERA/XILINX
    写给还在上班的人(转)
  • 原文地址:https://www.cnblogs.com/liuxueyang/p/2958274.html
Copyright © 2011-2022 走看看