symons

___________每一天都是幸福的!!

  博客园  ::  :: 新随笔  ::  :: 订阅 订阅  :: 管理

这道题是一道DP题,

解题思路:  NUM[i][j]表示在数字中从i到j位组成的数。

       dp[i][j]  表示前i位数字分成j段的最大乘积。

            状态转移方程 if(j==1) dp[i][j]=NUM[1][i];

                         if(j>=1&&j<=i)  dp[i][j]=max{ dp[d,j-1]*NUM[d+1][i] }其中 1<=d<i

            else if(i<j) dp[i][j]=0;

-----------------------------------------------------------------------------------

 1 #include <iostream>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <string>
 5 using namespace std;
 6 int num[50+5];
 7 int NUM[50+5][50+5];
 8 int dp[50+5][50+5];
 9 int change(int i,int j)
10 {
11     int res=0;
12     int I;
13     for(I=i;I<=j;++I)
14     {
15         res*=10;
16         res+=num[I];
17     }
18     return res;
19 }
20 int main()
21 {
22     string abc;
23     int i,j,d;
24     int n,k;
25     while(cin>>n>>k)
26     {
27         cin>>abc;
28         memset(dp,0,sizeof(dp));
29         for(i=0;i<n;++i)  //字符串转换为数组
30         {
31             num[i+1]=abc[i]-'0';
32         }
33         for(i=1;i<=n;++i)
34             for(j=i;j<=n;++j)
35             {
36                 NUM[i][j]=change(i,j);
37             };
38         for(i=1;i<=n;++i)
39             dp[i][1]=NUM[1][i];
40         for(i=1;i<=n;++i)
41         {
42             for(j=2;j<=k+1;++j)
43             {
44                 
45                 if(j>1&&j<=i)
46                 {
47                    for(d=1;d<i;++d)
48                    {
49                     dp[i][j]=max(dp[i][j],dp[d][j-1]*NUM[d+1][i]);
50                    }
51                 }
52                 else if(i<j) dp[i][j]=0;
53             }
54         }
55         cout<<dp[n][k+1]<<endl;
56     }
57     return 0;
58 }

 

posted on 2012-11-20 09:15  symons  阅读(155)  评论(0)    收藏  举报