zoukankan      html  css  js  c++  java
  • tyvj1014 乘法游戏

    描述

    乘法游戏是在一行牌上进行的。每一张牌包括了一个正整数。在每一个移动中,玩家拿出一张牌,得分是用它的数字乘以它左边和右边的数,所以不允许拿第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<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    using 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<<dp[1][n];
        return 0;
    }
  • 相关阅读:
    插入排序
    阅读书单 2012 8月至12月
    sed学习1
    sed入门(一直在改变系列2)
    linux find资料(一直在改变系列4)
    awk入门(一直在改变系列1)
    分治算法
    shell脚本知识点1(一直在改变系列3)
    选择排序(selection sort)
    英语单词循环记忆第一期(自学使用)
  • 原文地址:https://www.cnblogs.com/hyfer/p/5925013.html
Copyright © 2011-2022 走看看