您的位置:首页 > 其它

最大算式(动态规划)

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: