zoukankan      html  css  js  c++  java
  • uva11375Dp

    题意:给你n个火柴问能组成多少种不同的整数。

    6个及以上跟棒子的答案要加1 ,算上 0。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <climits>
    #include <string>
    #include <iostream>
    #include <map>
    #include <cstdlib>
    #include <list>
    #include <set>
    #include <queue>
    #include <stack>
    #include <math.h>
    using namespace std;
    const int maxn = 6666;
    int d[] = { 6, 2, 5, 5, 4, 5, 6, 3, 7, 6 };
    char dp[maxn][maxn];
    void gao(char *s1, char *s2)
    {
        int a[maxn] = { 0 }; int b[maxn] = { 0 }; int  c[maxn] = { 0 };
        int len1 = strlen(s1); int len2 = strlen(s2);
        int len = max(len1, len2);
        for (int i = 0; i < len1; i++){
            a[i] = s1[len1 - 1 - i] - '0';
        }
        for (int i = 0; i < len2; i++){
            b[i] = s2[len2 - i - 1] - '0';
        }
        for (int i = 0; i < len; i++){
            c[i] += a[i] + b[i];
            c[i + 1] = c[i] / 10;
            c[i] %= 10;
        }
        len++;
        while (!c[len]) len--;
        for (int i = 0; i <= len; i++)
            s1[i] = c[len - i] + '0';
        s1[len + 1] = '';
    }
    int main()
    {
        int n;
        dp[0][0] = '1';
        dp[0][1] = '';
        for (int i = 0; i <= 2000; i++){
            for (int j = 0; j < 10; j++){
                if ((i == 0 && j == 0) || i + d[j]>2000)  continue;
                gao(dp[i + d[j]], dp[i]);
            }
        }
        char str3[]= {"1"};
        gao(dp[6],str3);
        for (int i = 2; i <= 2000; i++){
            gao(dp[i], dp[i - 1]);
        }
        while (cin >> n){
            if(n==1){
                cout<<0<<endl;continue;
            }
            cout << dp[n] << endl;
        }
        return 0;
    }
  • 相关阅读:
    【背包专题】K
    【背包专题】J
    【背包专题】H
    【背包专题】C
    5972: 【递归入门】全排列
    51nod 1136 欧拉函数【数论】
    【背包专题】G
    【背包专题】I
    【背包专题】F
    各浏览器的Hack写法
  • 原文地址:https://www.cnblogs.com/yigexigua/p/4018381.html
Copyright © 2011-2022 走看看