1. 程式人生 > >NOIp2000 乘積最大

NOIp2000 乘積最大

logs new 代碼 include return code pos amp cnblogs

原blog地址

Luogu

題目是真的坑,__int128都會被卡掉,所以我直接去網上搞了個高精度的類。

\(dp[i,j]\) 為將前 \(j\) 個數用 \(i\) 個乘號乘起來的最優解。

\(A[i,j]\) 為從第 \(i\) 個數開始到第 \(j\) 個數拼起來的數。

\[dp[i,j]=\max_{i-1+[i=1]≤k<j} \{dp[i-1,k]*A[k+1,j]\}\]

為了視覺效果,我就直接扔上來 \(60\)long long代碼好了

#include <iostream>
#include <cstdio>

const int max_n = 40
+ 4; const int max_k = 6 + 4; int N, K; long long Dp[max_k][max_n], A[max_n][max_n]; char Num[max_n]; int main() { scanf("%d %d", &N, &K); scanf("%s", &Num[1]); for(int i = 1; i <= N; ++i) { Num[i] -= ‘0‘; Dp[0][i] = Dp[0][i - 1] * 10 + Num[i]; } for
(int i = 1; i <= N; ++i) for(int j = i; j <= N; ++j) A[i][j] = A[i][j - 1] * 10 + Num[j]; for(int i = 1; i <= K; ++i) for(int j = i + 1; j <= N; ++j) for(int k = (i == 1) ? 1 : i - 1; k < j; ++k) Dp[i][j] = std::max(Dp[i][j], Dp[i - 1
][k] * A[k + 1][j]); printf("%lld\n", Dp[K][N]); return 0; }

NOIp2000 乘積最大