整数划分之四 【区间dp】讲解于思考方法

一个老生长谈的问题

给出两个整数 n , m ,要求在 n 中加入m - 1 个乘号,将n分成m段,求出这m段的最大乘积

区间dp:

思路:先求出n从 i~j数位的 值

分析 m段的情况

4位的数  定义dp【i】【j】为讲 i 分为 j 段 的最大乘积值 为了更加直观 我颠倒了一下i j 让大家看得明白些

0        1         2       3  //       i

j 0    1        11      111    1111

1    0        1         11      121

2   0         0          0      0

3  0            0         0      0

#include<bits/stdc++.h>
using namespace std;
long long dp[50][50];
long long  a[50][50];
char n[50];
int m;
void add(int x,int y)
{
    int k = 1;
    for(int i = y;i>=x;i--)
    {
        a[x][y]+=((n[i]-'0')*k);
        k*=10;
    }
}
int main()
{
        int t;
        scanf("%d",&t);
        while(t--)
        {
                scanf("%s%d",n,&m);
                memset(dp,0,sizeof(dp));
                memset(a,0,sizeof(dp));
                int L = strlen(n);
                for(int i = 0;i <L ;i++)
                {
                    for(int j = i;j < L;j++)
                    {
                        add(i,j);//计算每个区间内的【i,j】
                    }
                }

            for(int i=0;i<L;i++)
                dp[i][0] = a[0][i];//dp【i】【j】为把 i 这个数分为j 份 的最大乘积  千万注意 dp【i】【j】与 a【i】【j】 是颠倒的
            m--;
            for(int j = 1; j <= m;j++)
            {
                for(int i = j;i <L;i++)
                {
                        for(int k = 0; k < i;k++)
                        {
                            dp[i][j] = max(dp[i][j],dp[k][j-1]*a[k+1][i]);//dp[1,2] = dp[0,1]*dp[1][2]
                        }
                }
            }
            for(int i = 0;i<L;i++)
            {
                for(int j = 0;j<L;j++)
                {
                    printf("%d ",dp[j][i]);
                }
                printf("\n");
            }
            printf("%lld\n",dp[L-1][m]);
        }
}
时间: 2024-07-30 01:35:38

整数划分之四 【区间dp】讲解于思考方法的相关文章

整数划分 (区间DP)

整数划分(四) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近遇到了一个难题,让他百思不得其解,他非常郁闷..亲爱的你能帮帮他吗? 问题是我们经常见到的整数划分,给出两个整数 n , m ,要求在 n 中加入m - 1 个乘号,将n分成m段,求出这m段的最大乘积 输入 第一行是一个整数T,表示有T组测试数据接下来T行,每行有两个正整数 n,m ( 1<= n <

环形区间DP

区间DP的一般思考方式是:先枚举长度,再枚举开头和结尾,再枚举中间的分割点 环形区间DP一般是把环展开成链后复制成两倍,再做线性的区间DP 1068. 环形石子合并 将 n 堆石子绕圆形操场排放,现要将石子有序地合并成一堆. 规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数记做该次合并的得分. 请编写一个程序,读入堆数 n 及每堆的石子数,并进行如下计算: 选择一种合并石子的方案,使得做 n?1 次合并得分总和最大. 选择一种合并石子的方案,使得做 n?1 次合并得分总和最小. 输入

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

转载+删改:算法讲解之Dynamic Programing —— 区间DP [变形:环形DP]

发现一篇好文,可惜发现有一些地方有排版问题.于是改了一下,并加了一些自己的内容. 原文链接 对区间DP和其变式环形DP的总结. 首先先来例题. 石子归并 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1].问安排怎样的合并顺序,能够使得总合并代价达到最小. 输入描述 Input Description 第一行一个整数n(n<=100) 第二行n个整数w1,w2...wn (wi

bzoj 3612: [Heoi2014]平衡【整数划分dp】

其实就是-n~n中求选k个不同的数,和为0的方案数 学到了新姿势叫整数划分,具体实现是dp 详见:https://blog.csdn.net/Vmurder/article/details/42551603 设f[i][j]为j个数和为i的方案数,然后因为互不相同,所以转移的话有两种,就是当前j个数全部+1,和当前j个数全部+1并且多填一个1出来,也就是f[i][j]=f[i-j][j]+f[i-j][j-1] 但是这里要求选的数不能超过n,我们考虑i>n的f中一定有一个大于n的数,我们把这种情

整数划分dp

整数划分 --- 一个老生长谈的问题: 1) 练练组合数学能力. 2) 练练递归思想 3) 练练DP 总之是一道经典的不能再经典的题目: 这道好题求: 1. 将n划分成若干正整数之和的划分数. 2. 将n划分成k个正整数之和的划分数. 3. 将n划分成最大数不超过k的划分数. 4. 将n划分成若干奇正整数之和的划分数. 5. 将n划分成若干不同整数之和的划分数. 1.将n划分成不大于m的划分法: 1).若是划分多个整数可以存在相同的: dp[n][m]= dp[n][m-1]+ dp[n-m][

hdu 5230 整数划分 dp

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5230 题意:给定n,c,l,r.求有多少种方法从1~n-1选取任意k数每个数的权重为其下标,使得这些数字之和加上c之后在l,r范围内. 题解:第一反应是计数01包,但是范围给定的n太大,TLE... 然后仔细想想,不就是求l~r范围内不重复的整数划分数嘛. dp[i][j]表示j这个数字,当前的拆分拥有i个拆分数时的方案数. 先考虑允许重复数字 : dp[i][j] = dp[i][j - i] + d

ACM 整数划分(四)

整数划分(四) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近遇到了一个难题,让他百思不得其解,他非常郁闷..亲爱的你能帮帮他吗? 问题是我们经常见到的整数划分,给出两个整数 n , m ,要求在 n 中加入m - 1 个乘号,将n分成m段,求出这m段的最大乘积 输入 第一行是一个整数T,表示有T组测试数据接下来T行,每行有两个正整数 n,m ( 1<= n <

2015 UESTC Training for Dynamic Programming A- 男神的礼物(区间dp)

A - 男神的礼物 Time Limit: 3000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status Lweb学长是集训队里公认的男神.有一天他要给美美的学姐姐准备礼物. Lweb学长可是会魔法的哟.为了准备一份礼物,男神要加工n份材料.每一次只能加工相邻的材料. 当男神加工两个魔法值为a,b的材料,男神都要消耗a*b的体力,同时在这个地方合成出魔法值(a+b)%100的材料. 男神