动态规划之乘法游戏
来源:互联网 发布:赢时胜软件上海分公司 编辑:程序博客网 时间:2024/05/18 06:36
题目:
乘法游戏是在一行牌上进行的。每一张牌包括了一个正整数。在每一个移动中,玩家拿出一张牌,得分是用它的数字乘以它左边和右边的数,所以不允许拿第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的整数,用空格分开。
输出文件只有一个数字:最小得分
样例输入
610 1 50 50 20 5
样例输出
3650
=============================
思路:dp[i][j]意为dp[i..j]该区间的最小值,如果在该区间中最后一次取的元素下标为k,即dp[i][j] = dp[i][k]+dp[k][j]+num[i]*num[k]*num[j].通过枚举i..j(不包括i、j)之间的值k。并通过上式,即可得到dp[i][j]这个区间的最小值。
接着对dp这个二维数组的初始化也要结合题意考虑,首先dp[i][i] = num[i],其次dp[i][i+1] = 0.则剩余元素可以初始化为(1<<31)-1 。
代码如下:
package hxl.test.jsk;import java.util.Scanner;public class Main {/** * @param args */public static void main(String[] args) {Scanner in = new Scanner(System.in);int N = in.nextInt();in.nextLine();int[] n = new int[110];int[][] dp = new int[110][110]; for(int i = 1;i<=N;i++){n[i] = in.nextInt();dp[i][i] = n[i];}in.close(); for(int i = 1;i<=N;i++){ for(int j = 1;j<=N;j++){//设置为int类型的最大值 dp[i][j] = (1<<31)-1; } }for (int i=1;i<=N-1;i++) dp[i][i+1]=0; //控制循环,并间接给出每次循环j的取值范围for(int i = 2 ;i<=N ;i++){//枚举j,j的取值范围随着i的增加,不断减1for(int j = 1;j<=N-i+1;j++){//枚举j..i+j-1之间的k,从而获取dp[j][i+j-1]的最小值for(int k = j+1;k<i+j-1;k++){dp[j][i+j-1] = min(dp[j][k]+dp[k][j+i-1]+n[j]*n[k]*n[i+j-1],dp[j][i+j-1]);}}} System.out.println(dp[1][N]);}private static int min(int i, int j) { if(i>j) return j;else return i;}}缺点:重叠子问题的计算
递归解法:
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int dp[110][110];int n,a[110];int dfs(int l,int r){ if(r-l<2) return 0; if(dp[l][r]!=-1) return dp[l][r]; int _min=(1<<31)-1; int cnt=0; for(int i=l+1;i<r;i++) { cnt=dfs(l,i)+dfs(i,r)+a[l]*a[i]*a[r];//k表示区间(l,r)最后断开位置 if(cnt<_min) _min=cnt; } return dp[l][r]=_min;}int main(){ while(cin>>n) { memset(dp,-1,sizeof(dp)); for(int i=1;i<=n;i++) cin>>a[i]; int cnt=dfs(1,n); cout<<cnt<<endl; } return 0;}
这个是参考 http://blog.csdn.net/kongming_acm/article/details/5830730这位大神的博客。
0 0
- 动态规划之乘法游戏
- 【动态规划】【tyvj】乘法游戏
- 动态规划之矩阵链乘法
- 动态规划之矩阵链乘法
- 动态规划之 矩阵链乘法
- 动态规划算法之矩阵链乘法
- 动态规划之矩阵链乘法
- 说说动态规划之矩阵链乘法
- 动态规划 - 之 - 矩阵链式乘法数
- 动态规划之矩阵链乘法
- 动态规划之矩阵链乘法
- 动态规划之矩阵链乘法理解
- 动态规划算法之矩阵链式乘法
- 动态规划之矩阵链乘法
- 动态规划之矩阵链乘法
- 动态规划之矩阵连乘法
- 动态规划之矩阵链乘法
- 动态规划之多边形游戏
- 29、文件操作--顺序文件的写操作
- 带图片的仿天猫导航栏
- JS 判断特殊字符
- 1 系统编程综述
- android6.0动态获取权限
- 动态规划之乘法游戏
- 哈希查找
- Java多线程基础问题
- [Nginx]实现反向代理(Windows版)
- 26.逻辑卷管理器(Logical Volume Manager)
- 【Hibernate】Hibernate对“悲观”和“乐观”锁的支持
- Spring4--Spring4整合mybatis3
- 关键字const有什么含义?
- python 编程风格术语说明