博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
tyvj1014 乘法游戏
阅读量:5358 次
发布时间:2019-06-15

本文共 1382 字,大约阅读时间需要 4 分钟。

描述

乘法游戏是在一行牌上进行的。每一张牌包括了一个正整数。在每一个移动中,玩家拿出一张牌,得分是用它的数字乘以它左边和右边的数,所以不允许拿第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
/*枚举区间内最后一个乘数*/#include
#include
#include
#include
#include
#define ll long longusing namespace std;const int maxn = 125;const ll inf = 987654321234LL;ll read(){ char ch=getchar(); ll x=0,f=1; while(!(ch>='0'&&ch<='9')){
if(ch=='-')f=-1;ch=getchar();}; while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();}; return x*f;}int n;ll a[maxn],dp[maxn][maxn];int main(){ n = read(); for(int i = 1;i <= n;i++) a[i] = read(); for(int i = 0;i <= n;i++){ for(int j = 0;j <= n;j++){ dp[i][j] = inf; } } for(int i = 1;i < n;i++){ dp[i][i+1] = 0; } int j; for(int l = 3;l <= n;l++){ for(int i = 1;i <= n-l+1;i++){ j = i + l - 1; for(int k = i + 1;k <= j-1;k++){ dp[i][j] = min(dp[i][j],dp[i][k] + dp[k][j] + a[i]*a[k]*a[j]); } } } cout<

 

转载于:https://www.cnblogs.com/hyfer/p/5925013.html

你可能感兴趣的文章
linux的子进程调用exec( )系列函数
查看>>
MySQLdb & pymsql
查看>>
zju 2744 回文字符 hdu 1544
查看>>
【luogu P2298 Mzc和男家丁的游戏】 题解
查看>>
前端笔记-bom
查看>>
上海淮海中路上苹果旗舰店门口欲砸一台IMAC电脑维权
查看>>
Google透露Android Market恶意程序扫描服务
查看>>
给mysql数据库字段值拼接前缀或后缀。 concat()函数
查看>>
迷宫问题
查看>>
【FZSZ2017暑假提高组Day9】猜数游戏(number)
查看>>
泛型子类_属性类型_重写方法类型
查看>>
练习10-1 使用递归函数计算1到n之和(10 分
查看>>
Oracle MySQL yaSSL 不明细节缓冲区溢出漏洞2
查看>>
Code Snippet
查看>>
zoj 1232 Adventure of Super Mario
查看>>
组合数学 UVa 11538 Chess Queen
查看>>
oracle job
查看>>
Redis常用命令
查看>>
[转载]电脑小绝技
查看>>
windos系统定时执行批处理文件(bat文件)
查看>>