最大算式(动态规划)
2017-07-06 12:09
267 查看
最近在学习动态规划的内容,看了一个比较好的博客,推荐网址:http://www.cnblogs.com/sdjl/articles/1274312.html
一个比较好的例题,求最大算式和,问题描述
题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大。因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号。例如:
开始的时候想用STL字典序排序方式做,虽然也可以,但是比较麻烦,而且容易超时,于是选择了用动态规划来做。
思路:母问题:求N个数中有K个乘号的最大算式和
子问题:求前i个数有j 个乘法的算是和
AC代码:
#include <iostream>
#include <stdio.h>
using namespace std;
int dp[1005][1005];//dp[i][j] 表示前i个数有j个乘号的和的最大值;
int a[1005];
int sum[1005];
int main()
{
int N, k;
scanf("%d %d",&N,&k);
sum[0]=0;
for(int i=1;i<=N;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];//求前i个数的累加和
}
for(int i=1;i<=N;i++)
dp[i][0]=sum[i];//当j=0时前i个数的和的最大值;
for(int i=2;i<=N;i++)
{
int t = min(i-1,k);//N个数中最多有k个乘号
for(int j=1;j<=t;j++)
{
for(int k=2;k<=i;k++)//k表示乘号的位置;
{
dp[i][j]=max(dp[i][j],dp[k-1][j-1]*(sum[i]-sum[k-1]));
}
}
}
printf("%d\n",dp
[k]);
return 0;
}
一个比较好的例题,求最大算式和,问题描述
题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大。因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号。例如:
开始的时候想用STL字典序排序方式做,虽然也可以,但是比较麻烦,而且容易超时,于是选择了用动态规划来做。
思路:母问题:求N个数中有K个乘号的最大算式和
子问题:求前i个数有j 个乘法的算是和
AC代码:
#include <iostream>
#include <stdio.h>
using namespace std;
int dp[1005][1005];//dp[i][j] 表示前i个数有j个乘号的和的最大值;
int a[1005];
int sum[1005];
int main()
{
int N, k;
scanf("%d %d",&N,&k);
sum[0]=0;
for(int i=1;i<=N;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];//求前i个数的累加和
}
for(int i=1;i<=N;i++)
dp[i][0]=sum[i];//当j=0时前i个数的和的最大值;
for(int i=2;i<=N;i++)
{
int t = min(i-1,k);//N个数中最多有k个乘号
for(int j=1;j<=t;j++)
{
for(int k=2;k<=i;k++)//k表示乘号的位置;
{
dp[i][j]=max(dp[i][j],dp[k-1][j-1]*(sum[i]-sum[k-1]));
}
}
}
printf("%d\n",dp
[k]);
return 0;
}
相关文章推荐
- 算法训练 最大的算式(动态规划)
- 蓝桥杯 最大的算式——动态规划
- 动态规划 最大的算式
- 动态规划 最大的算式
- 蓝桥杯 算法训练 最大的算式(动态规划)
- 蓝桥杯 算法训练 最大的算式 (动态规划)
- 【动态规划】最大的算式
- 最大的算式(BigExp) 动态规划
- TYVJ P1045最大的算式(动态规划)
- 乘积最大&蓝桥杯最大的算式 动态规划 递推
- 动态规划求最大子序列和
- HDU1231 最大连续子序列(动态规划)
- 动态规划-最大子段和问题
- 算法-计算递增最大子序列长度(动态规划)
- 【51nod 教程】最大子段和问题(动态规划)
- POJ 2593 动态规划(最大字串和)
- 最大的算式
- 动态规划_最大m子段和
- 2017年A组蓝桥杯(最大公共子串问题)【动态规划】
- 【动态规划】【RQNOJ】乘积最大