UVa 10446 - The Marriage Interview :-)

题目:统计递归函数调用的次数。

分析:动态规划(DP)。

            状态定义:f(n,back)为对应输入的调用次数;

            转移方程:f(n,back)= 1+sum(f(n-1,back),f(n-2,back),...,f(n-back,back));

            初始状态:f(0,x)= 1,f(1,x)= 1;

            注意每个状态都要+1代表自己,f(0,x)的时候不是0是1;

说明:输入中有n和back小于0的,按照题目里的%I64u输出一直WA,改成%llu就过了。。。

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

unsigned long long F[66][66];

int main()
{
	for (int i = 0; i < 61; ++ i) {
		for (int j = 0; j < 61; ++ j) {
			F[i][j] = 1ULL;
		}
	}
	for (int i = 2; i < 61; ++ i) {
		for (int j = 1; j < 61; ++ j) {
			F[i][j] = 1ULL;
			for (int k = 1; k <= j; ++ k) {
				if (i-k <= 1) {
					F[i][j] += 1ULL;
				}else if (i-k > 1) {
					F[i][j] += F[i-k][j];
				}
			}
		}
	}
	
	int n, back, cases = 1;
	while (~scanf("%d%d",&n,&back) && n < 61) {
		if (n >= 0 && back >= 0) {
			printf("Case %d: %llu\n",cases ++,F[n][back]); // %llu ?
		}else {
			printf("Case %d: 1\n",cases ++);
		}
	}
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值