https://www.luogu.com.cn/problem/P1018
偶然间看到,然后调了3个小时?
醉了。
我果然还是太菜了……
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll MAXN = 51;
char s[MAXN];
ll n,K;
struct hh{
int len,d[1001];
}a[MAXN][MAXN],dp[MAXN][11],c,xx;
hh mul(hh a,hh b){
memset(c.d,0,sizeof(c.d));
for(int i = 1;i <= b.len;i ++){
for(int j = 1;j <= a.len;j ++){
c.d[i + j - 1] += (b.d[i] * a.d[j]) % 10;
c.d[i + j] += (b.d[i] * a.d[j]) / 10;
if(c.d[i + j - 1] >= 10){
c.d[i + j] += c.d[i + j - 1] / 10;
c.d[i + j - 1] %= 10;
}
}
}
c.len = a.len + b.len;
while(!c.d[c.len] && c.len != 1) c.len --;
return c;
}
hh add(hh a,int b){
a.d[1] += b;
for(int i = 1;i <= a.len;i ++)
if(a.d[i] >= 10)
a.d[i] -= 10,a.d[i + 1] ++;
if(a.d[a.len + 1]) a.len ++;
return a;
}
hh Max(hh a,hh b){
if(a.len > b.len) return a;
else if(a.len < b.len) return b;
for(int i = a.len;i >= 1;i --){
if(a.d[i] > b.d[i]) return a;
else if(a.d[i] < b.d[i]) return b;
}
return a;
}
void print(hh a){
for(int i = a.len ;i >= 1;i --) cout << a.d[i];
cout << endl;
return;
}
void solve(){
xx.len = 2,xx.d[2] = 1,xx.d[1] = 0;
scanf("%lld%lld%s",&n,&K,s + 1);
for(int i = 1;i <= n;i ++){
a[i][i].len = 1;
a[i][i] = add(a[i][i],s[i] - '0');
for(int j = i + 1;j <= n;j ++)
a[i][j] = add(mul(a[i][j - 1],xx),s[j] - '0');
}
for(int i = 1;i <= n;i ++) dp[i][0] = a[1][i];
for(int k = 1;k <= K;k ++){
for(int i = 1;i <= n;i ++){
for(int j = 1;j < i;j ++){
dp[i][k] = Max(dp[i][k],mul(dp[j][k - 1] , a[j + 1][i]));
}
}
}
print(dp[n][K]);
return;
}
int main(){
solve();
return 0;
}