您的位置:首页 > 大数据 > 人工智能

hdu1023 Train Problem II

2015-08-21 10:57 387 查看
结题思路很容易想到递归,用记忆化搜索方式寻找答案。

由于ans可能非常大,用c++需要自己写加法器。

acm.hdu.edu.cn/showproblem.php?pid=1023

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
typedef __int64 LL;
const int maxn = 150 + 10;
char buffer[maxn * maxn][maxn];
LL f[maxn][maxn];
int n, N;

void add(int lhs, int rhs, int dest){
int d = 0;
for(int i = maxn - 2; i >= 0; i--){
int j = buffer[lhs][i] + buffer[rhs][i] + d;
buffer[dest][i] = j % 10;
d = j / 10;
}
}

int solve(int s, int q){
if(f[s][q] != -1) return f[s][q];
if(!q) return f[s][q] = 0;
if(s){
int l1 = solve(s + 1, q - 1), l2 = solve(s - 1, q);
add(l1, l2, N);
N++;
return f[s][q] = N - 1;
}
return f[s][q] = solve(s + 1, q - 1);
}

void print(int i){
int low = maxn - 1;
for(int j = 0; j < maxn - 1; j++){
if(buffer[i][j]){
low = j;
break;
}
}
for(int j = low; j < maxn - 1; j++) putchar(buffer[i][j] + '0');
putchar('\n');
}

int main(){
memset(f, -1, sizeof f);
memset(buffer, 0, sizeof buffer);
buffer[0][maxn - 2] = 1;
N = 1;
while(~scanf("%d", &n)){
int ans = solve(0, n);
print(ans);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: