您的位置:首页 > 其它

递归-完美覆盖(算法基础 第3周)

2016-06-06 16:05 316 查看

递归-完美覆盖

问题描述:





分析:

1. 原题出处POJ:http://cxsjsxmooc.openjudge.cn/hdxw11/A/

2. 网上大都是这样的思路:http://www.cnblogs.com/dagon/p/4835908.html (理论出处:http://www.cnblogs.com/drizzlecrj/archive/2008/12/23/1360670.html )实在没理解这套思路,就先用自己发现的规律来做了,以后需要的时候再研究。

3. 这里说一下自己发现的规律

当n=2时,只有三种方法:



n=4时,多了两种:



n=6时,同样增加两种:



这里我们可以总结如下规律:

当n=0, 标准答案里将其设为f(0)=1;

n为奇数时,无法实现完全覆盖,将其设为0;

其他情况下,

f(2)=3,

f(4)=3*f(2)+2,

f(6)=3*f(4)+2*f(2)+2,

f(n)=3*f(n-2)+2*(f(n-4)+f(n-6)+….+f(2))+2 = f(n-2)+2*(f(n-2)+f(n-4)+….+f(2))+2;

这样即实现递推了,可以用递归来解决这个问题,但写的时候发现直接正向用for循环实现方便多了,就直接用了for循环搞定。

4.写的时候要注意一点返回值类型设为int会导致溢出。

源码:

#include <iostream>
using namespace std;

int main() {
int n;
cin >> n;
while(n!=-1) {
if (n%2)
cout << 0 << endl;
else if (n==0)
cout << 1 << endl;
else {
long long last=0, last_sum=0, cur=3;
for (int i=4; i<=n; i=i+2){
last = cur;
last_sum += last;
cur = 2*last_sum+last+2;
}
cout << cur << endl;
}
cin >> n;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: