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

HDU 1165 Eddy's research II(递推)

时间:2015-08-30 11:22:07      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:dp

坑了我好久,乍看很简单,记忆化搜索结果爆栈,然后改成递推之后WA 。 后来发现,是在计算m=3的数据时出现了错误,因为当m=3时,即使n很小,结果也会很大,所以无法利用m=2时的结果递推,要怎么办呢?  将m=2的结果打印出来可以发现这是一个等差数列,通项为S(n) = 2*n + 3;

这有什么用呢? 我们可以发现,当 m=3时由递推式可以写成A(m,n) = A(2,A(m,n-1)) = 2*A(m,n-1) + 3; 所以只要知道了A(3,0),我们就能递推出所有m=3时的值了 。

细节参见代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<list>
#include<cmath>
#include<set>
#include<queue>
using namespace std;
typedef long long ll;
const int INF = 100000000;
const int mod = 1000000;
const long long maxn = 8000000+1;
int T,n,m,kase = 0, d[5][maxn] = {0};
int main() {
    for(int i=0;i<3;i++)
        for(int j=0;j<=1000000;j++) {
            if(i==0) d[i][j] = j+1;
            else if(i > 0 && j == 0) d[i][j] = d[i-1][1];
            else if(i > 0 && j > 0) d[i][j] = d[i-1][d[i][j-1]];
        }
        d[3][0] = d[2][1];
        for(int j=1;j<=24;j++) {
            d[3][j] = 2*d[3][j-1] + 3;
        }
    while(~scanf("%d%d",&m,&n)) {
        printf("%d\n",d[m][n]);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU 1165 Eddy's research II(递推)

标签:dp

原文地址:http://blog.csdn.net/weizhuwyzc000/article/details/48102671

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