动态规划之乘法游戏

来源:互联网 发布:赢时胜软件上海分公司 编辑:程序博客网 时间: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
原创粉丝点击