简单递推系列 uva习题
uva 11375 高精度加递推
主要是高精度加递推(主要思想还是参考liurujia书上)自己想了半天没有想出来。就不浪费时间了,理解后果断直接上模版。还犯了一个小错误wa一次0.0
1 // 2 // BigNum.cpp 3 // By Zhang xiaohao 4 // 5 // 6 #include <iostream> 7 #include <cstdio> 8 #include <cstring> 9 #define maxn 1010 10 using namespace std; 11 12 struct BigNum{ 13 char str[maxn]; //数字反着存方便运算 14 int len; 15 16 BigNum():len(0){ 17 memset(str, 0, sizeof str); 18 } 19 20 BigNum operator+(BigNum &num) 21 { 22 BigNum ret; 23 for(int i=0, g=0; g || i<max(len, num.len); i++){ 24 int ts = g; 25 if(i<len) ts+=(int)str[i]-'0'; 26 if(i<num.len) ts+=(int)num.str[i]-'0'; 27 g = ts/10; 28 ret.str[ret.len++] = ts%10+'0'; 29 } 30 ret.str[ret.len] = '\0'; 31 return ret; 32 } 33 34 BigNum operator+(int n) 35 { 36 BigNum num, ret; 37 sprintf(num.str, "%d", n); 38 num.len = strlen(num.str); 39 for(int i=0; i<num.len/2; i++){ 40 swap(num.str[i], num.str[num.len-i-1]); 41 } 42 ret = num+*this; 43 return ret; 44 } 45 46 BigNum operator=(char c[]){ 47 BigNum ret; 48 ret.len = strlen(c); 49 for(int i=ret.len-1; i>=0; i--){ 50 ret.str[i] = c[i]; 51 } 52 ret.str[len] = '\0'; 53 return ret; 54 } 55 56 BigNum operator=(int num){ 57 sprintf(this->str, "%d", num); 58 this->len = strlen(this->str); 59 for(int i=0; i<this->len/2; i++){ 60 swap(this->str[i], this->str[this->len-i-1]); 61 } 62 return *this; 63 } 64 }; 65 66 ostream& operator <<(ostream &out, const BigNum& x){ 67 for(int i=x.len-1; i>=0; i--){ 68 out << x.str[i]; 69 } 70 return out; 71 } 72 73 istream& operator >>(istream &in, BigNum& x){ 74 in >> x.str;; 75 x.len = strlen(x.str); 76 for(int i=0; i<x.len/2; i++){ 77 swap(x.str[i], x.str[x.len-i-1]); 78 } 79 return in; 80 } 81 82 int n, c[] = {6,2,5,5,4,5,6,3,7,6}; 83 BigNum dp[5010], sum[5010]; 84 85 void init() 86 { 87 for(int i=0; i<maxn; i++)dp[i] = 0; 88 for(int i=0; i<maxn; i++)sum[i] = 0; 89 dp[0] = 1; 90 sum[0] = 0; 91 for(int i = 0; i<=2000; i++){ 92 for(int j=0; j<10; j++){ 93 if(!(i==0 && j==0) && i+c[j]<=2000) dp[i+c[j]] = dp[i]+dp[i+c[j]]; 94 } 95 } 96 for(int i=1; i<=2000; i++){ 97 sum[i] = sum[i-1]+dp[i]; 98 if(i==6) sum[i] = sum[i]+1; 99 } 100 } 101 102 void debug() 103 { 104 for(int i=0; i<10; i++) 105 cout << dp[i] << endl; 106 } 107 108 int main() 109 { 110 // freopen("in.txt", "r", stdin); 111 112 init(); 113 while(scanf("%d", &n)!=EOF) 114 { 115 cout << sum[n] << endl; 116 } 117 return 0; 118 }
奔跑吧!少年!趁着你还年轻