乘法游戏

P1014 乘法游戏

时间: 1000ms / 空间: 131072KiB / Java类名: Main

背景

太原成成中学第2次模拟赛 第四道

描述

乘法游戏是在一行牌上进行的。每一张牌包括了一个正整数。在每一个移动中,玩家拿出一张牌,得分是用它的数字乘以它左边和右边的数,所以不允许拿第1张和最后1张牌。最后一次移动后,这里只剩下两张牌。
    你的目标是使得分的和最小。
    例如,如果数是10 1 50 20 5,依次拿1、20、50,总分是                       10*1*50+50*20*5+10*50*5=8000
    而拿50、20、1,总分是1*50*20+1*20*5+10*1*5=1150。

输入格式

输入文件的第一行包括牌数(3<=n<=100),第二行包括N个1-100的整数,用空格分开。

输出格式

输出文件只有一个数字:最小得分

测试样例1

输入


10 1 50 50 20 5

输出

3650


记忆化搜索:dp(x,y)指的是从x到y(不包括x,y),这一段中,中间的值,所以如果x+1>=y就是0(想像一下就2张牌的时候),
dp(x+1,i)+dp(i,y)+a[x]*a[i]*a[y]的意思是先计算了左边(x到i中间的一段),然后计算了右边(i到y中间一段),最后加上取出i的,比如5张牌,i=3,把2(左边)和4(右边)取了,再取中间的3(中间)。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define inf 1000000000
using namespace std;
int n,a[105],f[105][105];
int dp(int l,int r)
{
    if(l+1==r)return 0;
    if(f[l][r]<inf)return f[l][r];
    for(int i=l+1;i<r;i++)
        f[l][r]=min(f[l][r],dp(l,i)+dp(i,r)+a[l]*a[i]*a[r]);
    return f[l][r];
}
int main()
{
    memset(f,127,sizeof(f));
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    printf("%d\n",dp(1,n));
    return 0;
}

时间: 2024-10-07 18:39:40

乘法游戏的相关文章

&lt;区间DP&gt; 乘法游戏

链接:http://nanti.jisuanke.com/t/213 乘法游戏是在一行牌上进行的.每一张牌包括了一个正整数.在每一个移动中,玩家拿出一张牌,得分是用它的数字乘以它左边和右边的数,所以不允许拿第1张和最后1张牌.最后一次移动后,这里只剩下两张牌. 你的目标是使得分的和最小. 例如,如果数是10  1  50  20  5,依次拿1.20.50,总分是10*1*50+50*20*5+10*50*5=8000 而拿50.20.1,总分是1*50*20+1*20*5+10*1*5=115

【日常学习】【区间DP+高精】codevs1166 矩阵取数游戏题解

题目来自NOIP2007TG3 如果在考场上我现在已经歇菜了吧 今天一整天的时间全部投在这道题上,收获不小. 先上题目 题目描述 Description [问题描述] 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均 为非负整数.游戏规则如下: 1. 每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. 每次取走的各个元素只能是该元素所在行的行首或行尾: 3. 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分= 被取走的元素

Luogu P2734 游戏 A Game 区间DP

P2734 游戏 A Game 题目背景 有如下一个双人游戏:N(2 <= N <= 100)个正整数的序列放在一个游戏平台上,游戏由玩家1开始,两人轮流从序列的任意一端取一个数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束.以最终得分多者为胜. 题目描述 编一个执行最优策略的程序,最优策略就是使玩家在与最好的对手对弈时,能得到的在当前情况下最大的可能的总分的策略.你的程序要始终为第二位玩家执行最优策略. 输入输出格式 输入格式: 第一行: 正整数N, 表示序列中正整数的个数

qscoj 喵哈哈村的打印机游戏 区间dp

点这里去看题 区间dp ,dp[l][r][d]代表从l到r的区间底色为d,具体看代码 第一次见到区间dp...两个小时对着敲了五遍终于自己敲懂了一遍ac #include<bits/stdc++.h> using namespace std; int dp[55][55][55]; string s; int solve(int l,int r,int d) { if(l>r)return 0; if(l==r&&s[l]-'A'==d)return dp[l][r][

蓝桥杯:矩阵乘法(区间DP)

http://lx.lanqiao.cn/problem.page?gpid=T417 题意:…… 思路:n=1000,一开始觉得区间DP会超时,后来想不到其他做法就这样做了,居然没超时. 状态转移:dp[l][r] = min(dp[l][r], dp[l][k] * dp[k][r] + num[l]*num[k]*num[r]). 表示用l*k的矩阵去和k*r的矩阵相乘,然后取最小. 1 #include <bits/stdc++.h> 2 using namespace std; 3

【bzoj2121】字符串游戏 区间dp

题目描述 给你一个字符串L和一个字符串集合S,如果S的某个子串在S集合中,那么可以将其删去,剩余的部分拼到一起成为新的L串.问:最后剩下的串长度的最小值. 输入 输入的第一行包含一个字符串,表示L. 第二行包含一个数字n,表示集合S中元素个数. 以下n行,每行一个字符串,表示S中的一个元素. 输入字符串都只包含小写字母. 输出 输出一个整数,表示L的最短长度. 样例输入 aaabccd3acabcaaa 样例输出 2 题解 我们考虑:每次删除连续的一段,对应到原串上即:删除 $[l,r]$ 中所

tyvj1014 乘法游戏

描述 乘法游戏是在一行牌上进行的.每一张牌包括了一个正整数.在每一个移动中,玩家拿出一张牌,得分是用它的数字乘以它左边和右边的数,所以不允许拿第1张和最后1张牌.最后一次移动后,这里只剩下两张牌.    你的目标是使得分的和最小.    例如,如果数是10 1 50 20 5,依次拿1.20.50,总分是                       10*1*50+50*20*5+10*50*5=8000    而拿50.20.1,总分是1*50*20+1*20*5+10*1*5=1150. 输

2016&quot;百度之星&quot; - 初赛(Astar Round2A) 1004 D Game 区间DP

D Game Problem Description 众所周知,度度熊喜欢的字符只有两个:B 和D. 今天,它发明了一个游戏:D游戏. 度度熊的英文并不是很高明,所以这里的D,没什么高深的含义,只是代指等差数列[(等差数列百科)](http://baike.baidu.com/view/62268.htm)中的公差D. 这个游戏是这样的,首先度度熊拥有一个公差集合{D},然后它依次写下N个数字排成一行.游戏规则很简单: 1. 在当前剩下的有序数组中选择X(X≥2) 个连续数字: 2. 检查1选择

HDU 5396 Expression (区间DP)

链接 : http://acm.hdu.edu.cn/showproblem.php?pid=5396 设d[i][j] 代表i~j的答案.区间DP枚举(i, j)区间的断点,如果断点处的操作符是'*',那么该区间的答案可以直接加上d[i][k] *  d[k+1][j],因为乘法分配律可以保证所有的答案都会乘起来.如果是加法,需要加的 就是 左边的答案 乘 右边操作数的阶乘 加上 右边的答案乘左边操作数的阶乘,最后要确定左边操作和右边操作的顺序 因为每个答案里是统计了该区间所有的阶乘情况,因此

区间DP [NYOJ 536] 开心的mdd

开心的mdd 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 himdd有一天闲着无聊,随手拿了一本书,随手翻到一页,上面描述了一个神奇的问题,貌似是一个和矩阵有关的东西. 给出三个矩阵和其行列A1(10*100),A2(100*5),A3(5*50).现在himdd要算出计算矩阵所要的乘法次数,他发现不同的计算次序,所要的乘法次数也不一样, 如: (A1*A2)*A3 : 10*100*5+5*10*50=7500; A1*(A2*A3) : 5*100*50+1