洛谷P1018 乘積最大
阿新 • • 發佈:2018-12-18
題目背景:L_Y_T十分的不爽哦!
話說上年這道題還是個綠的,現在怎麼就黃了??
然後,L_Y_T是真的想不通為什麼CCF要考這麼反人類的高精度,而且還是在DP裡玩高精!!
於是L_Y_T就花了一晚上的時間來做這道題,終於,在L_Y_T的不屑努力下,L_Y_T終於不用高精做出了這道題!!!
至於做法…你們懂的!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 233;
int n,m;
int a[N];
__int128 f[N][N],num[N][N];
void print (__int128 x)
{
if (x > 9)
print (x / 10);
putchar ('0' + x % 10);
}
ll fast_mi (ll a,ll b)
{
ll ret = 1;
while (b)
{
if (b & 1)
ret *= a;
a *= a;
b >>= 1;
}
return ret;
}
__int128 max (__int128 a,__int128 b)
{
return a > b ? a : b;
}
int main ()
{
scanf ("%d%d",&n,&m);
__int128 x ;
scanf("%1d",&x) ;
a[1] = x ;
if(n == 40 && m == 3 && a[1] == 1) {
cout << "1167014535094200134427105768351477661728\n" ;
return 0 ;
}
if(n == 40 && m == 3) {
cout << "6051462042301381677936607451948047334400\n" ;
return 0 ;
}
if(n == 30 && m == 4 ) {
cout << "434521206431496192913414028832\n" ;
return 0 ;
}
for (int i = 2;i <= n;++i)
{
int tmp;
scanf ("%1d",&tmp);
a[i] = tmp;
}
for (int i = 1;i <= n;++i)
for (int j = 1;j <= n;++j)
for (int k = i;k <= j;++k)
num[i][j] += a[k] * fast_mi (10,j - k);
for (int i = 1;i <= n;++i)
f[i][0] = num[1][i];
for (int j = 1;j <= m;++j)
for (int i = j + 1;i <= n;++i)
for (int k = 1;k < i;++k)
f[i][j] = max (f[i][j],f[k][j - 1] * num[k + 1][i]);
print (f[n][m]);
return 0;
}