Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

乘法难题是一种用一行的卡片来玩的单人游戏,每张卡片上有一个正整数。在游戏者从中拿出一卡片,并且得到一个分数,它等于被拿走的卡片上的数与这张卡片左右两张卡片上的整数的积。第一张与与最后一张卡片不能被拿出。在最后一次移动后,这行卡片中只剩下两张。 你的目标是怎样确定拿卡片的顺序,以使得总分数的值最小。例如,有一行的卡片,它上面的数字为10 1 50 20 5, 游戏者可以先取走1这张卡片,然后是20 和50,总分数为10*1*50
+ 50*20*5 + 10*50*5 = 500+5000+2500 = 8000,如果他先拿50, 然接着20,最后取出1, 总分数为1*50*20 + 1*20*5 + 10*1*5 = 1000+100+50 = 1150。

【输入格式】

输入文件的第一行包含卡片的总数N(3 <= N <= 100),第二行包含N个范围在1到100之间的整数(两个整数之间有一个空格)

【输出格式】

输出文件包含一个整数,为最少的分数。

【数据规模】

Sample Input1

6
10 1 50 50 20 5

Sample Output1

3650
【题解】
设f[i][j]表示从i到j,除了i和j之外都被取走所能得到的最小分数。
f[i][j] = min(f[i][k]+f[k][j]+a[i]*a[k]*a[j]); i<k<j;
初值:f[i][i+1] == 0;
更新方式如下:
for (int L=2;L<= n;L++)
for (int s = 1;s <= n-l;s++)
{

int t = s+l;
for (int k = s+1;k<=t-1;k++)
f[i][j] = min(f[s][k]+f[k][t]+a[i]*a[k]*a[t],f[i][j]);

}
最后答案为f[1][n];
这里一定要先枚举这段的长度。
这样我们可以先获得像f[1][3],f[2][4],f[3][5]..f[n-2][n]这样的值。
然后我们在求f[1][4]的时候k在2..3枚举
f[1][4] = min(f[1][2]+f[2][4]+a[1]*a[2]*a[4],f[1][3]+f[3][4]+a[1]*a[3]*a[4]);
可以看到我们在求f[1][4]的时候要用到的f[2][4],f[1][3]都已经求出来了 。
这是原因所在。
也是这种类型动规的原理->不断利用小的区间扩大区间。
【代码】
#include <cstdio>
#include <cstring> int a[101],n,f[101][101]; int main()
{
memset(f, 127 / 3, sizeof(f));//一开始f数组赋值为一个很大的数字。
scanf("%d", &n);
for (int i = 1; i <= n; i++)//读入数据
scanf("%d", &a[i]);
for (int i = 1; i <= n - 1; i++)//从i到i+1除了i和i+1都不拿 那就是什么都没有。
f[i][i + 1] = 0;
for (int l = 2;l <= n;l++)//先枚举小的长度。为后面大的长度作铺垫。
for (int s = 1; s <= n - l; s++)//枚举起点。
{
int t = s + l;//这是终点
for (int k = s + 1; k <= t - 1; k++)//利用之前得到的小的区间最优值扩大。
{
int temp = f[s][k] + f[k][t] + a[s] * a[t] * a[k];//f[s][k]里有s,k。f[k][t]也有k,t。
//且只剩下k没取。那就把它取下来。看看是否更优。
if (temp < f[s][t])
f[s][t] = temp;
}
}
printf("%d\n", f[1][n]);
return 0;
}

【u011】乘法难题的更多相关文章

  1. 【动态规划】XMU 1029 矩阵链乘法

    题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1029 题目大意: 题同乘法难题.给n+1个数,头尾不能动,中间的数可取出,取出时代价是 ...

  2. 动归专题QAQ(两天创造的刷题记录哟!✿✿ヽ(°▽°)ノ✿✿)(未填坑)

    1092 采药:由于没有限制开始时间和结束时间,01背包就好了 1095 开心的金明:01背包,无fuck说 1104 摆花:f[i][j]表示摆了i种花,第i种花摆了j种的方案数,乱转移0.0(感觉 ...

  3. 5200 fqy的难题----2的疯狂幂

    5200 fqy的难题----2的疯狂幂  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description ...

  4. C语言 · 乘法表

    问题描述 输出九九乘法表. 输出格式 输出格式见下面的样例.乘号用"*"表示. 样例输出 下面给出输出的前几行:1*1=12*1=2 2*2=43*1=3 3*2=6 3*3=94 ...

  5. C语言 · 矩阵乘法 · 算法训练

    问题描述 输入两个矩阵,分别是m*s,s*n大小.输出两个矩阵相乘的结果. 输入格式 第一行,空格隔开的三个正整数m,s,n(均不超过200). 接下来m行,每行s个空格隔开的整数,表示矩阵A(i,j ...

  6. python_九九乘法表

    # 九九乘法表 print(" 九九乘法表") for table_x in range(1,10): for table_y in range(1,table_x +1): pr ...

  7. 【转】Python实现不同格式打印九九乘法表

    前言:最近在学习Python,学习资源有慕课网上的视频教程.菜鸟教程以及Python官方文档tutorial.虽然了解了Python的基本语法,但是还没有真正意义上输出自己写的代码.代码小白,之前仅学 ...

  8. 蓝桥杯算法提高 P1001(大数乘法)

      算法提高 P1001   时间限制:1.0s   内存限制:256.0MB   当两个比较大的整数相乘时,可能会出现数据溢出的情形.为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法. 具体 ...

  9. 深入super,看Python如何解决钻石继承难题 【转】

    原文地址 http://www.cnblogs.com/testview/p/4651198.html 1.   Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通 ...

随机推荐

  1. [RxJS] Learn How To Use RxJS 5.5 Beta 2

    The main changes is about how you import rxjs opreators from now on. And introduce lettable opreator ...

  2. Windows Server 2016 上配置 APACHE+SSL+PHP+perl

    Windows Server 2016 上配置 APACHE+SSL+PHP+perl 安装环境 谷歌云实例 Windows Server 2016 Apache Apache/2.4.25 (win ...

  3. 用PHP 去掉所有html标签里的部分属性

    用PHP 去掉所有html标签里的部分属性 http://zhidao.baidu.com/question/418471924.html 用PHP 去掉所有html标签里的部分属性 tppabs & ...

  4. Linux 解压缩命令整理

    一.tar命令 参数 参数 详解 参数 详解 -c 可以使用绝对路径来压缩 -x 解开一个压缩文件的参数指令 -t 查看内容 -r 向压缩归档文件末尾追加文件 -u 更新原压缩包中的文件 -z 有gz ...

  5. 【ASP.NET开发】.NET三层架构简单解析

    对于三层架构来说,主要是使用设计模式的思想,对于项目的各个模块实现"高内聚,低耦合"的思想.这里就不做详细的介绍了,如果大家有兴趣,可以阅读软件工程和设计模式相关文章. 对于三层架 ...

  6. How to Rotate Tomcat catalina.out

    If catalina.out becomes 2GB in size, tomcat crashes and fails to start without any error message. To ...

  7. 【COGS1672】【SPOJ375】QTREE

    这是我的第一个边权链剖 COGS上和SPOJ有点不一样就是没有多组数据了本质还是一样的 我写的是COGS那个事实上改一改就能够去SPOJ AC了= -= (但是我如今上不去SPOJ卧槽(╯‵□′)╯︵ ...

  8. nginx源代码分析--事件模块 &amp; 琐碎

    通过HUP信息使得NGINX实现又一次读取配置文件,使用USR2信号使得NGINX实现平滑升级. 在nginx中有模块这么一说,对外全部的模块都是ngx_module_t类型,这个结构体作为全部模块的 ...

  9. 目标识别(object detection)中的 IoU(Intersection over Union)

    首先直观上来看 IoU 的计算公式: 由上述图示可知,IoU 的计算综合考虑了交集和并集,如何使得 IoU 最大,需要满足,更大的重叠区域,更小的不重叠的区域. 两个矩形窗格分别表示: 左上点.右下点 ...

  10. Python Tricks(二十)—— 阶乘的极简实现

    使用 reduce # 比如计算 9 的阶乘 >> reduce(lambda x, y: x*y, range(1, 9+1)) 362880 当然这里的 reduce 直接返回具体的数 ...