<区间DP> 乘法游戏

链接: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=1150。

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

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

样例输入

6
10 1 50 50 20 5

样例输出

3650

分析:区间DP

代码:

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int dp[110][110];
int a[110];
const int INF=0x3f3f3f3f;
int main()
{
    int i,j,k,p,n=0;
   while(scanf("%d",&n)!=EOF)
    {
        for(i=0; i<n;i++)            scanf("%d",&a[i]);
        memset(dp,0,sizeof(dp));
        for(p=3; p<=n;p++)         //区间长度
        {
            for(i=0; i<n-2;i++)    //枚举区间起点
            {
                j=i+p-1;            //区间终点
                dp[i][j]=INF;
                for(k=i+1;k<j; k++)
                   dp[i][j]=min(dp[i][k]+dp[k][j]+a[i]*a[k]*a[j],dp[i][j]);
            }
        }
       printf("%d\n",dp[0][n-1]);
    }
    return 0;
}

链接: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=1150。
输入文件的第一行包括牌数(3<=n< =100),第二行包括N个1-100的整数,用空格分开。
输出文件只有一个数字:最小得分
样例输入

6
10 1 50 50 20 5
样例输出

3650

分析:区间DP
代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int dp[110][110];
int a[110];
const int INF=0x3f3f3f3f;
int main()
{
    int i,j,k,p,n=0;
   while(scanf("%d",&n)!=EOF)
    {
        for(i=0; i<n;i++)            scanf("%d",&a[i]);
        memset(dp,0,sizeof(dp));
        for(p=3; p<=n;p++)         //区间长度
        {
            for(i=0; i<n-2;i++)    //枚举区间起点
            {
                j=i+p-1;            //区间终点
                dp[i][j]=INF;
                for(k=i+1;k<j; k++)
                   dp[i][j]=min(dp[i][k]+dp[k][j]+a[i]*a[k]*a[j],dp[i][j]);
            }
        }
       printf("%d\n",dp[0][n-1]);
    }
    return 0;
}
 
时间: 2024-08-09 22:01:39

<区间DP> 乘法游戏的相关文章

【日常学习】【区间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