整数划分(四)
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
-
暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近遇到了一个难题,让他百思不得其解,他非常郁闷。。亲爱的你能帮帮他吗?
问题是我们经常见到的整数划分,给出两个整数 n , m ,要求在 n 中加入m - 1 个乘号,将n分成m段,求出这m段的最大乘积
- 输入
- 第一行是一个整数T,表示有T组测试数据
接下来T行,每行有两个正整数 n,m ( 1<= n < 10^19, 0 < m <= n的位数);
- 输出
- 输出每组测试样例结果为一个整数占一行
- 样例输入
-
2 111 2 1111 2
- 样例输出
-
11 121
AC代码:1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<string> 6 using namespace std; 7 long long dp[20][20],sum,mmax; 8 int n,pp[20]; 9 void dfs(int m,int cot,int p)//深度遍历,去掉注释,更容易看出来; 10 { 11 if(cot == m) 12 { 13 sum=1; 14 for(int i=0; i<=cot;i++) 15 { 16 // cout<<pp[i]<<" "<<pp[i+1]<<endl; 17 sum*=dp[pp[i]][pp[i+1]]; 18 } 19 if(sum>mmax) 20 mmax=sum; 21 } 22 else for(int i=p ; i<n ;i++) 23 { 24 // cout<<i<<endl; 25 pp[cot+1]=i; 26 dfs(m,cot+1,i+1); 27 } 28 } 29 int main() 30 { 31 int i,j,k,t,m,nn[25]; 32 char s[25]; 33 cin>>t; 34 while(t--) 35 { 36 memset(dp, 0, sizeof(dp)); 37 mmax=0; 38 cin>>s>>m ; 39 int len=strlen(s); 40 for(i=0; i<len; i++)//先转化为单个的整型 41 nn[i]=s[i]-'0'; 42 pp[m]=len;n=len; 43 for(i=0 ; i<=len ; i++) 44 for(j=i+1 ; j<=len ; j++) 45 for(k=i; k<j ; k++) 46 dp[i][j]=dp[i][j]*10+nn[k];//截取从i到j的一段,转化为long long 47 dfs(m-1,0,1); 48 cout<<mmax<<endl; 49 } 50 return 0; 51 }