[luoguP1388] 算式(DP)

传送门

看这个n<=15本以为是个状压DP

还是too young

这个题最神奇的地方是加括号是根据贪心的策略。

发现只有在一连串的加号两边加上括号才是最优的(想一想,为什么?)

f[i][j]表示前i个数加j个乘号的最优解

#include <cstdio>
#define max(x, y) ((x) > (y) ? (x) : (y))

int n, m;
int f[20][20];

int main()
{
	int i, j, k, x;
	scanf("%d %d", &n, &m);
	for(i = 1; i <= n; i++)
	{
		scanf("%d", &x);
		f[i][0] = f[i - 1][0] + x;
	}
	for(i = 2; i <= n; i++)
		for(j = 1; j < i; j++)
			for(k = 1; k < i; k++)
				f[i][j] = max(f[i][j], f[k][j - 1] * (f[i][0] - f[k][0]));
	printf("%d\n", f[n][m]);
	return 0;
}

  

时间: 2024-12-07 19:53:10

[luoguP1388] 算式(DP)的相关文章

算法训练 最大的算式(DP)

问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大.因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号.例如: N=5,K=2,5个数字分别为1.2.3.4.5,可以加成: 1*2*(3+4+5)=24 1*(2+3)*(4+5)=45 (1*2+3)*(4+5)=45 …… 输入格式 输入文件共有二行,第一行为两个有空格隔开的整数,表示N和K,其中(2<=N<=15, 0<=K<=N

TYVJ P1045 &amp;&amp;洛谷 1388 最大的算式 Label:dp

描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大.因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号.例如:N=5, K=2,5个数字分别为1.2.3.4.5,可以加成:1*2*(3+4+5)=241*(2+3)*(4+5)=45(1*2+3)*(4+5)=45…… 输入格式 输入文件共有二行,第一行为两个有空格隔开的整数,表示N和K,其中(2<=N<=15, 0<=K<=N-1).第二

2015暑假多校联合---Expression(区间DP)

题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=5396 Problem Description Teacher Mai has n numbers a1,a2,?,anand n−1 operators("+", "-" or "*")op1,op2,?,opn−1, which are arranged in the form a1 op1 a2 op2 a3 ? an. He wan

蓝桥杯 算法训练 ALGO-116 最大的算式

算法训练 最大的算式 时间限制:1.0s   内存限制:256.0MB 问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大.因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号.例如: N=5,K=2,5个数字分别为1.2.3.4.5,可以加成: 1*2*(3+4+5)=24 1*(2+3)*(4+5)=45 (1*2+3)*(4+5)=45 -- 输入格式 输入文件共有二行,第一行为两个有空格隔开的

ZOJ 3892 Available Computation Sequence 区间dp

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5595 题意:给出n个字符串,里面包含'*', '.', '^', '!'这四个运算符,以及小写字母(表示向量)和数字. 四个运算符都有不同的运算规则.问添上括号后,可以组成多少个不同的算式(不能进行非法运算). 思路:简单区间DP,把一个运算符看成一位. dp[i][j][1]表示第i-j位运算结果为数字的情况有多少种. dp[i][j][0]表示第i-j位运算结果

HDU 4507 求指定范围内与7不沾边的所有数的平方和 (数位DP)

题意:求区间[l,r]内所有与7无关的数的平方和(取模)定义与7无关的数:                                      1.数字的数位上不能有7                                     2.数字的数位和不能是7的倍数                                     3.数字本身不能是7的倍数分析:状态的保存:1.数位上不能有7: 只需枚举数位的数字的时候跳过7就好 if (i == 7) continue;2.

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

POJ - 3186 Treats for the Cows (区间DP)

题目链接:http://poj.org/problem?id=3186 题意:给定一组序列,取n次,每次可以取序列最前面的数或最后面的数,第n次出来就乘n,然后求和的最大值. 题解:用dp[i][j]表示i~j区间和的最大值,然后根据这个状态可以从删前和删后转移过来,推出状态转移方程: dp[i][j]=max(dp[i+1][j]+value[i]*k,dp[i][j-1]+value[j]*k) 1 #include <iostream> 2 #include <algorithm&