区间DP——整数划分(使乘积最大)

来源:互联网 发布:yum install telnet 编辑:程序博客网 时间:2024/05/21 11:26


#include <iostream>#include <cstring>#include <cmath>using namespace std;#define SIZE 20char 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;}


原创粉丝点击