NYOJ 746 - 正整数n划分为m段,求m段的最大乘积 【区间DP】

整数划分(四)

时间限制:1000 ms  |  内存限制:65535 KB

描述

给出两个整数 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
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
using namespace std;

typedef long long LL;

char n[25];
LL dp[25][25];
LL a[25][25];

int main ()
{
    int T, m;
    scanf("%d", &T);
    while(T--) {
        scanf("%s%d", &n, &m);
        int len = strlen(n);

        // 初始化
        for(int i=0; i<len; i++) {
            a[i][i] = n[i] - ‘0‘;
            for(int j=i+1; j<len; j++) {
                a[i][j] = a[i][j-1]*10 + n[j]-‘0‘;
            }
        }

        for(int i=0; i<len; i++) {
            dp[i][1] = a[0][i];
            for(int j=2; j<=m; j++) {
                if(i+1 < j) {
                    dp[i][j] = 0;
                } else {
                    dp[i][j] = -1;
                    for(int k=1; k<=i; k++) {
                        if(dp[k-1][j-1]*a[k][i] > dp[i][j]) {
                            dp[i][j] = dp[k-1][j-1]*a[k][i];
                        }
                    }
                }
            }
        }
        printf("%lld\n", dp[len-1][m]);
    }
    return 0;
}
时间: 2024-10-12 21:10:00

NYOJ 746 - 正整数n划分为m段,求m段的最大乘积 【区间DP】的相关文章

NYOJ 1103 —— m划分为n个正整数的个数

多边形划分 时间限制:1000 ms  |  内存限制:65535 KB 描述 Give you a convex(凸边形), diagonal n-3 disjoint divided into n-2 triangles(直线), for different number of methods, such as n=5, there are 5 kinds of partition method, as shown in Figure 输入 The first line of the inp

NYOJ 651 —— n划分为2个以上不同正整数的划分个数

Cut the rope 时间限制:1000 ms  |  内存限制:65535 KB 描述 We have a rope whose length is L. We will cut the rope into two or more parts, the length of each part must be an integer, and no two parts have the same length. Your task is to calculate there exists ho

47、软件需求工程的活动可以划分为5个独立的阶段:需求获取、需求建模、形成需求规格、需求验证和需求管理,需求建模是()

2013年下半年软考高级信息系统项目管理师综合知识真题答案与解析: 47.软件需求工程的活动可以划分为5个独立的阶段:需求获取.需求建模.形成需求规格.需求验证和需求管理,需求建模是() A.分析需求的正确性和可行性的过程 B.对需求的抽象描述 C.对生成需求模型构件的精确的形式化的描述 D.开发.捕获和修订用户的需求 信管网参考答案:B 信管网解析: 需求建模就是需求分析过程,目的是对各种需求信息进行分析并抽象描述,为目标系统建立一个概念模型.软件需求工程活动的5个阶段:http://www.

区间dp 括号匹配 nyoj 15

题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=15 括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来. 如: []是匹配的 ([])[]是匹配的 ((]是不匹配的 ([)]是不匹配的 输入 第一行输入

内存分配(堆、栈、BSS、代码段、数据段)

这两天看了马士兵老师的视频.视频中提到了一个万能钥匙.就是了解程序运行中对内存的操作.主要讲了堆.栈.Data.说真的有点晕.看了两遍.也就略懂一二.在这做个小小知道总结 简介 我们程序运行的时候都是放在内存里的.根据静态.成员函数.代码段.对象.等等.放在不同的内存分块里.大概分为5块 1  栈 2  堆 3 BSS段-全局区-(静态区) 4 代码段 5 数据段 栈 存放局部变量.临时变量.声明.返回值.指向堆对象的地址(指针).总之存放一些小的东西.当不需要时候.栈会自动清除.比如一个加法方

HDU1556 【树状数组】(改段求点)

#include<cstdio> #include<algorithm> #include<cstring> #define maxn 100050 using namespace std; int b[maxn]; int n; int lowbit(int x) { return x&(-x); } void ADD(int x, int c) //向下查询 { for (int i=x; i>0; i-=i&(-i)) b[i] += c;

内存布局:栈,堆,BSS段(静态区),代码段,数据段

摘自:https://www.cnblogs.com/Spider-spiders/p/8884729.html 简介 我们程序运行的时候都是放在内存里的.根据静态.成员函数.代码段.对象.等等.放在不同的内存分块里.大概分为5块 1  栈 2  堆 3 BSS段-全局区-(静态区) 4 代码段 5 数据段 栈 存放局部变量.临时变量.声明.返回值.指向堆对象的地址(指针).总之存放一些小的东西.当不需要时候.栈会自动清除.比如一个加法方法里面.声明了两个int并赋值.这两个就是放在栈里面.类里

java合并两段音频成一段 同时播放类似伴奏

/** * * @param partsPaths 要合成的音频路径数组 * @param unitedFilePath 输入合并结果数组 */ public void uniteWavFile(String[] partsPaths, String unitedFilePath) { byte byte1[] = getByte(partsPaths[0]); byte byte2[] = getByte(partsPaths[1]); byte[] out = new byte[byte1.

BSS段、数据段、代码段、堆与栈

BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域. BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域. 数据段属于静态内存分配. 代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区 域.这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读