zoukankan      html  css  js  c++  java
  • SDUT3146:Integer division 2(整数划分区间dp)

    题目:传送门

    题目描述

    This is a very simple problem, just like previous one.
    You are given a postive integer n, and you need to divide this integer into m pieces. Then multiply the m pieces together. There are many way to do this. But shadow95 want to know the maximum result you can get.

    输入

     First line is a postive integer t, means there are T test cases.
    Following T lines, each line there are two integer n, m. (0<=n<=10^18, 0 < m < log10(n))

    输出

     Output the maximum result you can get.

    示例输入

    1
    123 2

    示例输出

    36
    

    提示

    You can divide "123" to "12" and "3".
    Then the maximum result is 12*3=36.
     
    题意很简单,但是我就是个渣渣,dp的题在比赛里从来没有A过,果断还是看了题解,也只是会了这个类型,其他类型的区间dp果断还是不会,果断不能举一反三啊。
     
    代码如下:
    #include <iostream>
    #include <algorithm>
    #include <stdio.h>
    #include <string.h>
    typedef long long ll;
    using namespace std;
    #define mod 1000000007
    int m,l;
    char s[22];//局部变量与全局变量求字符串长度完全不同
    ll a[20][20],dp[20][20];
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%s",s+1);
            scanf("%d",&m);
            l=strlen(s+1);
            memset(a,0,sizeof(a));
            if(m==1||m==0)
            {
                printf("%s
    ",s+1);
                continue;
            }
            for(int i=1;i<=l;i++)
            {
                for(int j=i;j<=l;j++)
                {
                    a[i][j]=a[i][j-1]*10+(s[j]-'0');
                }
            }
            memset(dp,0,sizeof(dp));
            for(int i=0;i<=l;i++)
                dp[i][1]=a[1][i];
            for(int j=2;j<=m;j++)
            {
                for(int i=j;i<=l;i++)
                {
                    for(int k=1;k<i;k++)
                    {
                        dp[i][j]=max(dp[i][j],dp[k][j-1]*a[k+1][i]);
                    }
                }
            }
            printf("%lld
    ",dp[l][m]);
        }
        return 0;
    }
     
     
  • 相关阅读:
    echarts —— 绘制横向柱状图(圆角、无坐标轴)
    浅析微信支付:(余额提现)企业付款到微信用户零钱或银行卡账户
    浅析微信支付:支付验收示例和验收指引
    浅析微信支付:如何使用沙箱环境测试
    linux内存源码分析
    linux内存源码分析
    linux内存管理源码分析
    linux源码分析
    移植python笔记
    linux中断源码分析
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/4328403.html
Copyright © 2011-2022 走看看