1. 程式人生 > >洛谷P1018 乘積最大

洛谷P1018 乘積最大

題目背景: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; }