wikioi 1017--乘积最大

给定一个数串,以及K,求对这个数串K划分的乘积最大值。

DP思路:一开始肯定想到的是递归,假设在某两个字符间有一个乘号,那么乘积最大就是乘号两边的区间接着划分的乘积最大值。

于是状态空间表示如下dp[i][k]表示从0~i之间有K个乘号的乘积最大值,

dp[i][k] = max(dp[j][k-1]*num[j+1][i])(k<=j<=i-1)

 1 #include <iostream>
 2 #include <queue>
 3 #include <climits>
 4 #include <algorithm>
 5 #include <memory.h>
 6 #include <stdio.h>
 7 #include <ostream>
 8 #include <vector>
 9 #include <list>
10 #include <cmath>
11 #include <string>
12 using namespace std;
13
14 int num[50][50];
15 int dp[50][10];
16 int main()
17 {
18     int N,K;
19     string s;
20     cin>>N>>K;
21     cin>>s;
22     int i,j;
23     for(i = 0 ; i < N ; ++i)
24     {
25         int tmp = 0;
26         for(j = i ; j < N ; ++j)
27         {
28             tmp = tmp*10+s[j]-‘0‘;
29             num[i][j] = tmp;
30         }
31     }
32     memset(dp,0,sizeof(dp));
33     for(j = 0; j < N ; ++j)
34     {
35         dp[j][0] = num[0][j];
36     }
37     for(j = 0; j < N ; ++j)
38     {
39         int k,t;
40         for(k = 1;k <= K; ++k)
41         {
42             for(t = 0; t < j;++t)
43             {
44                 dp[j][k] = max(dp[t][k-1]*num[t+1][j],dp[j][k]);
45             }
46         }
47     }
48     cout<<dp[N-1][K]<<endl;
49     return 0;
50 }

wikioi 1017--乘积最大

时间: 2024-10-12 21:53:41

wikioi 1017--乘积最大的相关文章

CodeVS 1017 乘积最大

1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加.活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K

CodeVs 1017 乘积最大(DP)

题目大意: http://codevs.cn/problem/1017/ 题解: #include <iostream> using namespace std; char ch[45]; int n,k; long long int arr[45][7]; long long int dp[45][7]; int main() { cin >> n >> k >> ch; for(int i = 0; i < n; i++){ int tmp = 0

[codevs1017]乘积最大

1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加.活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K

Codevs_1017_乘积最大_(划分型动态规划/记忆化搜索)

描述 http://codevs.cn/problem/1017/ 给出一个n位数,在数字中间添加k个乘号,使得最终的乘积最大. 1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友

dp练习(9)——最大乘积

1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 今年是国际数学联盟确定的"2000--世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加.活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K

wikioi 1251--括号

题目描述:给定n个变量,求乘积的表达式的个数.相邻元素相乘需要加*号. 思路:直接递归即可,ans[i][j] = ans[i][k]+ans[k+1][j](i<=k<j);对于单个字符而言,没有括号 1 #include<cstdio> 2 #include<cmath> 3 #include<iostream> 4 #include<algorithm> 5 #include<cstring> 6 #include<vec

uva 1017 - Merrily, We Roll Along!(几何线性轮廓)

题目链接:uva 1017 - Merrily, We Roll Along! 将所有点依次连接起来形成一条曲线,圆心移动的轨迹其实就是一条时刻与它距离为r的曲线. 对于线段就是平移,对于点就是一个圆.要求的轨迹其实就是所有线段和圆的轮廓,所以从起始位置开始,每次暴力出下一要移动到的点,距离就是最终的和. 对于从圆上的点A移动到线段或是圆上的点B,角AOB(O为圆心)要尽量小. 对于从线段上的点A移动到线段或是圆上的点B,AB的距离要尽量小. #include <cstdio> #includ

luogu 乘积最大

题目描述 今年是国际数学联盟确定的"2000――世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加.活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大. 同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子: 有一个数字串:312, 当N=3,K=1时

2000年 乘积最大

乘积最大 题目描述 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加.活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大. 同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子: 有一个数字串:312, 当N=3,K=1时