简单递推系列 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] = '';
 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] = '';
 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 }
View Code
奔跑吧!少年!趁着你还年轻
原文地址:https://www.cnblogs.com/shu-xiaohao/p/3410046.html