给定n(N<=100),编程计算有多少个不同的n轮状病毒。
Input
第一行有1个正整数n。
Output
将编程计算出的不同的n轮状病毒数输出
Sample Input
3
Sample Output
16
神dp。如果没看题解真心想不出来
#include<stdio.h> #include<string.h> #define MAXD 110 int N; struct BigInteger { char a[MAXD]; const static int D = 100; void init(int n) { int i; for(i = 0; i < D; i ++) { a[i] = n % 10; n /= 10; } } BigInteger add(BigInteger &b) { int i, s, c; BigInteger ans; c = 0; for(i = 0; i < D; i ++) { s = a[i] + b.a[i] + c; ans.a[i] = s % 10; c = s / 10; } return ans; } BigInteger minus(BigInteger &b) { int i, s, c; BigInteger ans; c = 0; for(i = 0; i < D; i ++) { s = a[i] + c; if(s >= b.a[i]) { ans.a[i] = s - b.a[i]; c = 0; } else { c = -1; ans.a[i] = s + 10 - b.a[i]; } } return ans; } void print() { int i; for(i = D - 1; i > 0 && a[i] == 0; i --); for(; i >= 0; i --) printf("%d", a[i]); } }f[MAXD], h[MAXD], g[MAXD]; void init() { f[1].init(0), g[1].init(1), h[1].init(1); f[2].init(3), g[2].init(2), h[2].init(3); } void solve() { int i; for(i = 3; i <= N; i ++) { f[i] = f[i - 1].add(f[i - 1]).add(h[i - 1]).minus(h[i - 2]); g[i] = f[i - 1].add(g[i - 1]).add(h[i - 1]); h[i] = f[i - 1].add(h[i - 1]).add(h[i - 1]).minus(h[i - 2]); } f[N].add(g[N]).print(); printf("\n"); } int main() { while(scanf("%d", &N) == 1) { init(); solve(); } return 0; }
——by zhber,转载请注明来源