區間DP——整數劃分(使乘積最大)
阿新 • • 發佈:2019-02-16
#include <iostream> #include <cstring> #include <cmath> using namespace std; #define SIZE 20 char arr[SIZE]; int Num[SIZE][SIZE]; int DP[SIZE][SIZE]; int len; int cutNum; void getNum(){ int mid; for( int i = 1; i <= len; ++i ) Num[i][i] = arr[i] - '0'; for( int dist = 1; dist <= len; ++dist ){ for( int start = 1; ( start + dist ) <= len; ++start ){ mid = ( start + start + dist ) / 2; Num[start][start + dist] = Num[start][mid] * pow( 10, ( start + dist - mid ) ) + Num[mid + 1][start + dist]; } } } void cal(){ for( int i = 1; i <= len; ++i ) DP[i][0] = Num[1][i]; for( int cutNum = 0; cutNum <= len - 1 ; ++cutNum ){ for( int end = 1; end <= len; ++end ){ for( int pos = 1; pos <= end; ++pos ){ if( end > cutNum && pos > ( cutNum - 1 ) && ( pos + 1 ) <= end ) DP[end][cutNum] = max( DP[end][cutNum], DP[pos][cutNum - 1] * Num[pos + 1][end] ); } } } } int main(){ memset( DP, 0, sizeof(DP) ); cin >> len >> cutNum; for( int i = 1; i <= len; ++i ) cin >> arr[i]; getNum(); cal(); cout << "ANS: " << DP[len][cutNum - 1] << endl; return 0; }