动态规划提醒总结

一、划分型dp

  • 简介:简单来说就是需要把一个东西划分为m份,考虑如何划分最优。
  • 例题:

noip2000 乘积最大

题目描述  Description    

今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目:

设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。

同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:

有一个数字串:312, 当N=3,K=1时会有以下两种分法:

1)  3*12=36

2)  31*2=62

这时,符合题目要求的结果是:31*2=62

现在,请你帮助你的好朋友XZ设计一个程序,求得正确的答案。

输入描述  Input Description     

   程序的输入共有两行:

第一行共有2个自然数N,K(6≤N≤40,1≤K≤6)

第二行是一个长度为N的数字串。

输出描述  Output Description   

结果显示在屏幕上,相对于输入,应输出所求得的最大乘积(一个自然数)。

样例输入   Sample Input  

4  2

1231

样例输出  Sample Output   

62

 1 #include <iostream>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <cstdlib>
 6 #include <algorithm>
 7 using namespace std;
 8 long long t[50][50];
 9 long long s[50];
10 long long dp[50][10];
11 int main()
12 {
13     int n,k;
14     scanf("%d%d",&n,&k);
15     long long x;  //long long在这种解法中十分重要!
16     scanf("%lld",&x);
17     for(int i=n;i>=1;i--)
18     {
19         s[i]=x%10;
20         t[i][i]=s[i];
21         x/=10;
22     }
23     for(int i=1;i<n;i++)  //初始化:t[i][j]指从 i到 j的数
24     {
25         for(int j=i+1;j<=n;j++)
26         {
27             t[i][j]=t[i][j-1]*10+s[j];
28             //cout<<t[i][j]<<" ";
29         }
30         //cout<<endl;
31     }
32     for(int i=1;i<=n;i++) dp[i][0]=t[1][i];   //初始化:dp[i][j]即为前 i个数字里添加 j个乘号的最大值
33
34     for(int i=1;i<=k;i++)
35         for(int j=i+1;j<=n;j++)
36             for(int h=i;h<j;h++)   //i,j中间的空当部分可以任意添加乘号
37                 dp[j][i]=max(dp[j][i],dp[h][i-1]*t[h+1][j]);
38     printf("%d",dp[n][k]);
39     return 0;
40 }

codevs 1017

时间: 2024-12-18 08:48:54

动态规划提醒总结的相关文章

通过金矿模型介绍动态规划

对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划.本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出,谢谢! ----第一节----初识动态规划-------- 经典的01背包问题是这样的: 有一个包和n个物品,包的容量为m,每个物品都有各自的体积和

小白书关于动态规划

10192 最长公共子序列 http://uva.onlinejudge.org/index.php?option=com_onlinejudge& Itemid=8&page=show_problem&category=114&problem=1133&mosmsg= Submission+received+with+ID+13297616 */ #include <cstdio> #include <string.h> #include&

易懂动态规划讲解

通过金矿模型介绍动态规划 对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划.本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出,谢谢! ----第一节----初识动态规划-------- 经典的01背包问题是这样的:       有一个包和n个物品,

通过金矿模型介绍动态规划(转)

原文地址 点击下载01背包测试数据.rar 对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划.本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出,谢谢! ----第一节----初识动态规划-------- 经典的01背包问题是这样的: 有一个包和n个

动态规划算法(转载)

动态规划算法 例题1: https://segmentfault.com/a/1190000008244955 例题2: https://segmentfault.com/a/1190000007927865 讲解: http://www.hawstein.com/posts/dp-novice-to-advanced.html 顶级讲解动态规划:http://www.cnblogs.com/SDJL/archive/2008/08/22/1274312.html(本文转载自此文) 下面是原文:

动态规划--多边形游戏

1.问题描述:   给定N个顶点的多边形,每个顶点标有一个整数,每条边上标有+(加)或是×(乘)号,并且N条边按照顺时针 依次编号为1~N.下图给出了一个N=4个顶点的多边形. 游戏规则 :(1) 首先,移走一条边. (2) 然后进行下面的操作: 选中一条边E,该边有两个相邻的顶点,不妨称为V1和V2.对V1和V2顶点所标的整数按照E上所标运算符号(+或是×)进行运算,得到一个整数:用该整数标注一个新顶点,该顶点代替V1和V2 . 持续进行此操作,直到最后没有边存在,即只剩下一个顶点.该顶点的整

对动态规划算法的理解及相关题目分析

1.对动态规划算法的理解 (1)基本思想: 动态规划算法的基本思想与分治法类似:将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解中得到原问题的解.但是,与分治法不同的是,为了避免重复多次计算子问题,动态规划算法用一个表记录所有已解决的子问题的答案,不管该子问题以后是否被利用,只要它被计算过,就将其结果填入表中. (2)设计动态规划算法的步骤: ①找出最优解的性质,并刻画其结构特征 ②递归地定义最优值 ③以自底向上的方式计算最优值 ④根据计算最优值时得到的信息构造最优解 (3)

webstorm开发微信小程序代码提醒(webstorm开发工具)

使用了微信提供的开发工具是真心难用,卡顿厉害.中英文切写注释换相当不爽.还没办法多开窗口,相信大家也遇到过这种现象. 下边我们介绍下webstorm来开发微信小程序的一些配置: 1.首先FileType下Cascading Style Sheet 添加*.wxss 1.png 2.FileType下HTML 添加*.wxml 2.png 3.将其中的wecharCode.jar下载下来,然后在webStorm 的 File -> import settings 中导入即可 3.png 配置已经完

Leetcode 494 Target Sum 动态规划 背包+滚动数据

这是一道水题,作为没有货的水货楼主如是说. 题意:已知一个数组nums {a1,a2,a3,.....,an}(其中0<ai <=1000(1<=k<=n, n<=20))和一个数S c1a1c2a2c3a3......cnan = S, 其中ci(1<=i<=n)可以在加号和减号之中任选. 求有多少种{c1,c2,c3,...,cn}的排列能使上述等式成立. 例如: 输入:nums is [1, 1, 1, 1, 1], S is 3. 输出 : 5符合要求5种