随笔 - 418  文章 - 0  评论 - 18  阅读 - 131万

nyoj746 整数划分(四)

整数划分(四)

时间限制: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 }
复制代码

 

posted on   细雨微光  阅读(410)  评论(0编辑  收藏  举报

点击右上角即可分享
微信分享提示