wikioi 1017 乘积最大
dp[i][j]=max(dp[i][j],dp[t][k-1]*mapn[t+1][i]);
dp[i][j]代表从0-i之间有j个乘号,mapn[i][j]表示第i位到第j位的数究竟是多少
1 #include <cstdio> 2 #include <cmath> 3 #include <cstring> 4 #include <ctime> 5 #include <iostream> 6 #include <algorithm> 7 #include <set> 8 #include <vector> 9 #include <sstream> 10 #include <queue> 11 #include <typeinfo> 12 typedef long long ll; 13 using namespace std; 14 char str[10010]; 15 ll mapn[50][50]; 16 int main() 17 { 18 int n,m; 19 cin>>n>>m; 20 cin>>str; 21 for(int i=0;i<n;i++) 22 { 23 int mm; 24 mm=0; 25 for(int j=i;j<n;j++) 26 { 27 mm=mm*10+str[j]-'0'; 28 mapn[i][j]=mm; 29 } 30 } 31 ll dp[51][10]; 32 memset(dp,0,sizeof(dp)); 33 for(int i=0;i<n;i++) 34 dp[i][0]=mapn[0][i]; 35 for(int i=0;i<n;i++) 36 { 37 for(int k=1;k<=m;k++) 38 { 39 for(int t=0;t<i;t++) 40 { 41 dp[i][k]=max(dp[i][k],dp[t][k-1]*mapn[t+1][i]); 42 } 43 } 44 } 45 cout<<dp[n-1][m]<<endl; 46 return 0; 47 }