贴代码:(dp解释在后面)
#include <bits/stdc++.h>
#define long long int
using namespace std;
int tp[50],dp[50][10];
int N,k;
int turn ( int b , int e ){
if ( b>e )
swap(b,e);
int sum=0;
for ( int i = b ; i <= e ; i++ ){
sum=sum*10+tp[i];
}
return sum;
}
signed main (){
cin >>N>>k;
char c;
for ( int i = 1 ; i <= N ; i++ ){
cin >>c;
tp[i]=c-'0';
}
//dp[i][k]
for ( int i = 1 ; i <= N-k ; i++ ){
dp[i][0]=turn(1,i);
}
/*
for ( int j = 1 ; j <= N-1 ; j++ )//deal item
for ( int kp = 0 ; kp <= min(k-1,j-1) ; kp++ )//list 'k'
for ( int i = j+1 ; i <= N ; i++ ){//be dealt item
int temp=turn(j+1,i);
//cout <<"dp["<<i<<"]["<<kp+1<<"]=max(dp["<<i<<"]["<<kp+1<<"],dp["<<j<<"]["<<kp<<"]*turn("<<j+1<<","<<i<<"));"<<endl;
dp[i][kp+1]=max(dp[i][kp+1],dp[j][kp]*temp);//right
}
*/
for ( int i = 1 ; i <= N ; i++ )//deal item
for ( int kp = 1 ; kp <= min(k,i-1) ; kp++ )//list 'k'
for ( int j = 1 ; j <= i-1 ; j++ ){//be dealt item
int temp=turn(j+1,i);
cout <<"dp["<<i<<"]["<<kp<<"]=max(dp["<<i<<"]["<<kp<<"],dp["<<j<<"]["<<kp-1<<"]*turn("<<j+1<<","<<i<<"));"<<endl;//调试
dp[i][kp]=max(dp[i][kp],dp[j][kp-1]*temp);//right
}
cout <<dp[N][k]<<endl;//下面是调试
for ( int i = 0 ; i <= N ; i++ ){
for ( int j = 0 ; j <= k ; j++ ){
cout <<dp[i][j]<<" ";
}
cout <<endl;
}
return 0;
}
QWQ~
本蒟蒻20分,上面注释掉的是递推式DP,下面的是回头望月式DP,不知到为什么会WA。
回头望月式dp表示:dp[i][k]->存前i位有k个乘号时的最大乘积。