您的位置:首页 > 其它

nyoj_746 整数划分(四)

2016-09-13 09:24 309 查看
题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=746
分析:

dp[i][j] : 表示在区间 [0,i] 插入 j 个乘号可以得到的最大值

 a[i][j] : 表示区间 [i,j] 所形成的数

 

 则:  dp[i][j]=max(dp[k][j-1]*a[k+1][i])

代码:

#include<cstdlib>

#include<string>

#include<iostream>

#include<cmath>

#include<cstring>

#include<algorithm>

#include<iomanip>

#include<ctime>

#include<cstdio>

#include<stack>

#include<map>

#include<set>

#include<queue>

#include<vector>

using namespace std;

typedef long long ll;

int main()

{

    int tt;

    scanf("%d",&tt);

    ll dp[25][25];  

    ll a[25][25];

    char ss[25];

    while(tt--)

    {

        int m;

        scanf("%s%d",ss,&m);

        memset(dp,0,sizeof(dp));

        memset(a,0,sizeof(a));

        m--;

        int len = strlen(ss);

        for(int i=0;i<len;i++)

        {

            a[i][i] = ss[i]-'0';

//            cout<<a[i][i]<<endl;

            for(int j=i+1;j<len;j++)

            {

                a[i][j] = a[i][j-1] * 10 + ss[j]-'0';                

//                cout<<a[i][j]<<endl;

            }            

        }

        

        for(int i=0;i<len;i++)

        {

            dp[i][0]=a[0][i];

        }

        

        for(int j=1;j<=m;j++)

        {

            for(int i=j;i<len;i++)

            {

                for(int k=0;k<i;k++)

                {

                    dp[i][j]=max(dp[i][j],dp[k][j-1]*a[k+1][i]);

                }

            }

        }        

        printf("%lld\n",dp[len-1][m]);        

    }    

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: