最大のシーズン10 L製品オフ休日チーム牛(DP、多数)

リンク:https://ac.nowcoder.com/acm/contest/1072/L?&headNav=acm&headNav=acm
出典:牛オフネットワーク

最大の製品の
時間制限:C / C ++ 1秒、他の言語2秒
スペースの制約:C / C ++ 262144K、他の言語524288K
64ビットIOフォーマット:%LLDの
対象説明
今年は「2000--世界数理年」を決定するために国際数学連合です90はまた、有名な数学者周氏インディアン華の誕生日と一致しています。壮観の活動を組織氏華の故郷ジンタン、数学のクイズ、あなたの良い友人XZの1にも参加する名誉を持っていました。活動は、そのようなタイトルに参加する全てのプレイヤーへのホストは:
数値のN文字列の長さで、プレイヤーはポイントを見つけるために、K + 1の部分にそれに署名乗算Kの使用を必要とし、 K + 1この乗算最大の部分片することができます。
一方、正しく問題を理解することができるプレーヤーを助けるために、減速材もまた、以下の実施例に引用されている:
数字の列:312、N = 3、K = 1次の2点の方法が存在することになる場合:
1)3 12 = 36
2)31
2 = 62
この場合、結果は対象の要件に沿ったものである:31 * 2 = 62
今、あなたの友人が正しい答えを得るためにプログラムを設計XZ助けてください。
入力説明:
最初の2行目の自然数N、Kは(6≤N≤ある K≤6≤40,1)、
2行目は、長さNの数値列であります
説明出力:
出力の決定された最大積(自然数)。
例1
入力
レプリケーション
。4 2
1231の
出力
コピー
62

思考:
DP DP状態として定義される[I] [j]は、i番目の桁の代表的な、得られる最大生成物とj番目の乗算です。

長さが原因で、それは40であるので、破裂するLONGLONG、および多数のテンプレートを使用しなければなりません。

詳細コードを参照してください。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
inline void getInt(int* p);
const int maxn = 1000010;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
const int MAXN=50;
struct bign
{
    int len, s[MAXN];
    bign ()
    {
        memset(s, 0, sizeof(s));
        len = 1;
    }
    bign (int num) { *this = num; }
    bign (const char *num) { *this = num; }
    bign operator = (const int num)
    {
        char s[MAXN];
        sprintf(s, "%d", num);
        *this = s;
        return *this;
    }
    bign operator = (const char *num)
    {
        for(int i = 0; num[i] == '0'; num++) ;  //去前导0
        len = strlen(num);
        for(int i = 0; i < len; i++) s[i] = num[len-i-1] - '0';
        return *this;
    }
    bign operator + (const bign &b) const //+
    {
        bign c;
        c.len = 0;
        for(int i = 0, g = 0; g || i < max(len, b.len); i++)
        {
            int x = g;
            if(i < len) x += s[i];
            if(i < b.len) x += b.s[i];
            c.s[c.len++] = x % 10;
            g = x / 10;
        }
        return c;
    }
    bign operator += (const bign &b)
    {
        *this = *this + b;
        return *this;
    }
    void clean()
    {
        while(len > 1 && !s[len-1]) len--;
    }
    bign operator * (const bign &b) //*
    {
        bign c;
        c.len = len + b.len;
        for(int i = 0; i < len; i++)
        {
            for(int j = 0; j < b.len; j++)
            {
                c.s[i+j] += s[i] * b.s[j];
            }
        }
        for(int i = 0; i < c.len; i++)
        {
            c.s[i+1] += c.s[i]/10;
            c.s[i] %= 10;
        }
        c.clean();
        return c;
    }
    bign operator *= (const bign &b)
    {
        *this = *this * b;
        return *this;
    }
    bign operator - (const bign &b)
    {
        bign c;
        c.len = 0;
        for(int i = 0, g = 0; i < len; i++)
        {
            int x = s[i] - g;
            if(i < b.len) x -= b.s[i];
            if(x >= 0) g = 0;
            else
            {
                g = 1;
                x += 10;
            }
            c.s[c.len++] = x;
        }
        c.clean();
        return c;
    }
    bign operator -= (const bign &b)
    {
        *this = *this - b;
        return *this;
    }
    bign operator / (const bign &b)
    {
        bign c, f = 0;
        for(int i = len-1; i >= 0; i--)
        {
            f = f*10;
            f.s[0] = s[i];
            while(f >= b)
            {
                f -= b;
                c.s[i]++;
            }
        }
        c.len = len;
        c.clean();
        return c;
    }
    bign operator /= (const bign &b)
    {
        *this  = *this / b;
        return *this;
    }
    bign operator % (const bign &b)
    {
        bign r = *this / b;
        r = *this - r*b;
        return r;
    }
    bign operator %= (const bign &b)
    {
        *this = *this % b;
        return *this;
    }
    bool operator < (const bign &b)
    {
        if(len != b.len) return len < b.len;
        for(int i = len-1; i >= 0; i--)
        {
            if(s[i] != b.s[i]) return s[i] < b.s[i];
        }
        return false;
    }
    bool operator > (const bign &b)
    {
        if(len != b.len) return len > b.len;
        for(int i = len-1; i >= 0; i--)
        {
            if(s[i] != b.s[i]) return s[i] > b.s[i];
        }
        return false;
    }
    bool operator == (const bign &b)
    {
        return !(*this > b) && !(*this < b);
    }
    bool operator != (const bign &b)
    {
        return !(*this == b);
    }
    bool operator <= (const bign &b)
    {
        return *this < b || *this == b;
    }
    bool operator >= (const bign &b)
    {
        return *this > b || *this == b;
    }
    string str() const
    {
        string res = "";
        for(int i = 0; i < len; i++) res = char(s[i]+'0') + res;
        return res;
    }
};
istream& operator >> (istream &in, bign &x)
{
    string s;
    in >> s;
    x = s.c_str();
    return in;
}
ostream& operator << (ostream &out, const bign &x)
{
    if (x.str()=="") out<<0;
    else out << x.str();
    return out;
}
string a;
int n,k;
bign dp[41][7];
bign temp;
int main()
{
    //freopen("D:\\code\\text\\input.txt","r",stdin);
    //freopen("D:\\code\\text\\output.txt","w",stdout);
    gbtb;
    cin>>n>>k>>a;
    a="0"+a;
    for(int i=1;i<=n;++i)
    {
        for(int j=0;j<=k;j++)
        {
            dp[i][j]=0;
        }
    }
    for(int i=0;i<=k;++i)
    {
        dp[0][i]=1;
    }
    for(int i=1;i<=n;++i)
    {
        dp[i][0]=bign(a.substr(1,i).c_str());
        for(int j=1;j<=k;j++)
        {
            for(int z=0;z<=i;z++)
            {
                temp=dp[z][j-1]*bign(a.substr(z+1,(i-z)).c_str());
                if(temp>dp[i][j])
                    dp[i][j]=temp;
            }
        }
    }
    cout<<dp[n][k]<<endl;
    return 0;
}
 
inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch == ' ' || ch == '\n');
    if (ch == '-') {
        *p = -(getchar() - '0');
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 - ch + '0';
        }
    }
    else {
        *p = ch - '0';
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 + ch - '0';
        }
    }
}
 
 

おすすめ

転載: www.cnblogs.com/qieqiemin/p/11347966.html