码迷,mamicode.com
首页 > 其他好文 > 详细

hdu-1028

时间:2017-03-13 23:45:27      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:clu   str   bsp   scan   argv   else   改进   size   scanf   

一、递归

构造一个函数fun(int n,int m);

n表示输入的N,m表示组成N中的任意一个小项不超过m;

  4 = 4;
  4 = 3 + 1;
  4 = 2 + 2;
  4 = 2 + 1 + 1;
  4 = 1 + 1 + 1 + 1;

分情况

  1 m>n  例:fun(4,6)=fun(4,4);

    fun(n,m)=fun(n,n);

  2 m=n 例: fun(4,4)=1+fun(4,3);  要么小项中有4(此时只有一种情况),要么没有;

    fun(n,m)=1+fun(n,m-1);

  3 m<n 例:   fun(4,2)=fun(2,2)+fun(4,1); 要么小项中有2(此时剩下4-2=2),要么没有2;

    fun(n,m)=fun(n-m,m)+fun(n,m-1);  

  4 递归结束标志

    n=1或m=1 此时为1;

#include <stdio.h>

int fun1(int n,int m){
    if(n==1||m==1) return 1;
    else if(m>n) return fun1(n,n);
    else if(m==n) return fun1(n,m-1)+1;
    else return fun1(n-m,m)+fun1(n,m-1);
}
int main(int argc, char *argv[]) {
    int n;
    while(~scanf("%d",&n)){
        printf("%d\n",fun1(n,n));
    }
    
    return 0;
}

发现超时;

改进

#include <stdio.h>
#include<string.h>

int a[130][130];//dp方法

int fun1(int n,int m){
    if(a[n][m]!=-1) return a[n][m];
    else if(n==1||m==1) return a[n][m]=1;
    else if(m>n) return a[n][m]=fun1(n,n);
    else if(m==n) return a[n][m]=fun1(n,m-1)+1;
    else return a[n][m]=fun1(n-m,m)+fun1(n,m-1);
}
int main(int argc, char *argv[]) {
    int n;
    memset(a,-1,sizeof(a));
    while(~scanf("%d",&n)){
        printf("%d\n",fun1(n,n));
    }
    
    return 0;
}

 

hdu-1028

标签:clu   str   bsp   scan   argv   else   改进   size   scanf   

原文地址:http://www.cnblogs.com/jiang2017/p/6545447.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!