记录编号 552845 评测结果 AAAAAAAAAA
题目名称 [NOIP 2000PJ]乘积最大 最终得分 100
用户昵称 GravatarEvolt 是否通过 通过
代码语言 C++ 运行时间 0.006 s
提交时间 2020-08-07 16:25:30 内存使用 13.75 MiB
显示代码纯文本
#include <cstring>
#include <cstdio>
#include <string>
#include <iostream>
#define N 41
#define K 7
using namespace std;
typedef unsigned long long ULL;
string s;
int n,e;
ULL f[N][N][K];
ULL num(int i,int j){
    ULL cnt = 0;
    for(int q = i;q <= j;++ q){
        cnt = (cnt << 1) + (cnt << 3) + s[q] - '0';
    }
    return cnt;
}
int main(){
    freopen("cjzd.in","r",stdin);
    freopen("cjzd.out","w",stdout);
    cin >> n >> e >> s;
    s = ' ' + s;
    for(int i = 1;i <= n;++ i){
        for(int j = 1;j <= n;++ j){
            f[i][j][0] = num(i , j);
           // cout << f[i][j][0] << ' ';
        }
       // printf("\n");
    }
    for(int k = 1;k <= e;++ k){
        for(int len = 2;len <= n;++ len){
            for(int j = 1;j + len <= n + 1;++ j){
                int end = j + len - 1;
                for(int i = j;i < end;++ i){
                    for(int q = 0;q < k&&q < len;++ q){
                        if(q < i - j + 1&&k - q - 1 < end - i + 1)f[j][end][k] = max(f[j][end][k] , f[j][i][q] * f[i + 1][end][k - q - 1]);
                    }
                }
            }
        }
    }
    cout << f[1][n][e] << endl;
    fclose(stdin);
    fclose(stdout);
    return 0;
}