题目链接
NYOJ好像没了,不知道哪里能测评
题目及大佬题解链接
https://www.cnblogs.com/mooncode/p/10989408.html
解题思路
代码1:
dp[i][j]
表示前i位数,由j个乘号得到的最大值
转移方程: dp[i][j]=max(dp[i][j],dp[k][j-1]*a[k+1][i]
j<=k<i
代码2:
dp[i][j][k]
表示i到j位数由k个乘号得到的最大值
转移方程: dp[i][j][k]=max(dp[i][j][k],dp[i][t][k-1]*a[t+1][j]
未必AC的代码1
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=20; int T,n,m; int main(){ cin>>T; while(T--){ cin>>n>>m; int a[N][N],dp[N][N],num=0,tmp=n,cnt=0; while(tmp){ cnt++; tmp/=10; } for(int i=1;i<=cnt;i++) for(int j=i;j<=cnt;j++) a[i][j]=n%((int)(pow(10,cnt-i+1)))/(pow(10,cnt-j)); for(int i=1;i<=cnt;i++) dp[i][0]=a[1][i]; for(int i=2;i<=cnt;i++) for(int j=0;j<i && j<m;j++) for(int k=j;k<i;k++) dp[i][j]=max(dp[i][j],dp[k][j-1]*a[k+1][i]); cout<<dp[cnt][m-1]<<endl; } }
未必AC的代码2
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=20; int T,n,m; int main(){ cin>>T; while(T--){ cin>>n>>m; int a[N][N],dp[N][N][N],num=0,tmp=n,cnt=0; while(tmp){ cnt++; tmp/=10; } for(int i=1;i<=cnt;i++) for(int j=i;j<=cnt;j++) a[i][j]=n%((int)(pow(10,cnt-i+1)))/(pow(10,cnt-j)),dp[i][j][0]=a[i][j]; for(int len=2;len<=cnt;len++) for(int i=1;i+len-1<=len;i++){ int j=i+len-1; for(int k=1;k<len && k<m;k++) for(int t=i;t<j;t++) dp[i][j][k]=max(dp[i][j][k],dp[i][t][k-1]*a[t+1][j]); } cout<<dp[1][cnt][m-1]<<endl; } }