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

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

【题目描述】

桌子上从左到右放着n张牌,每张牌上都有一个正整数。每次,我们可以从中拿出一张牌(不能拿第一张和最后一张牌),得分就是这张牌的数乘以他左边和右边的数。如此不断的重复,最后就只剩下两张牌了。现在,你的目标就是使得分的和最小。

    例如,如果数是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的整数,用空格分开。

【输出格式】

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

【分析】

区间dp,状态:f[i][j]表示[i,j]区间内的最小分数。

我们在区间内枚举一个k,表示取的那个数,就可以解出f[i][j]=min(f[i][k]+a[i]*a[k]*a[j]+f[k][j])

答案就是f[1][n],初始值,所有的都是inf,f[i][i]=0,f[i-1][i]=0,f[i][i+1]=0。

【代码】

1 #include
2 3 using namespace std; 4 const int inf=9999999; 5 int f[110][110],n,a[110]; 6 int main() 7 { 8 memset(f,inf,sizeof(f)); 9 scanf("%d",&n);10 for(int i=1;i<=n;i++){11 scanf("%d",&a[i]);12 f[i-1][i]=0,f[i][i]=0,f[i][i+1]=0;13 }14 for(int i=2;i<=n-2;i++) f[i-1][i+1]=a[i-1]*a[i]*a[i+1];15 for(int i=n-2;i>=1;i--){16 for(int j=i+2;j<=n;j++){17 for(int k=i+1;k

 

转载于:https://www.cnblogs.com/Dawn-Star/p/9153119.html

你可能感兴趣的文章
Vim快捷键分类
查看>>
What is the .NET Framework?
查看>>
Xilinx Spartan 6 管脚分配(转)
查看>>
二层设备与三层设备的区别--总结
查看>>
iOS开发_Foundation框架
查看>>
Day01 计算机硬件基础
查看>>
Cocos2dx - Lua
查看>>
Struts2基础学习(四)—类型转换器和数据校验
查看>>
Post流提交、接收
查看>>
长表单
查看>>
SAP iDoc 概念及管理
查看>>
WPF 免费控件库
查看>>
一个web初学者的笔记总结
查看>>
微信小程序组件解读和分析:四、icon图标
查看>>
Java ——正则表达式
查看>>
Matlab——图形绘制——三维立体图形 剔透玲珑球 动态图——彗星状轨迹图
查看>>
Sublime Text3 调色板 ColorPicker插件安装及快捷键
查看>>
数论--康托展开
查看>>
基于webpack4+vue-cli3项目的换肤功能
查看>>
itk_component packed in the sub-class
查看>>