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;
    }
  • 相关阅读:
    pandas--对axis=0,axis=1的理解
    启动secondarynamenode时报错
    5月27日经历问题(在有框架的情况下从无到有增加一套功能)
    5.21工作记录(修改页面跳转,去掉多余的js;增加图片清除功能)
    工作记录520
    5月14日经历问题
    idea快捷键
    Linux下常用redis指令
    初识lunix
    Redis
  • 原文地址:https://www.cnblogs.com/hyfer/p/5925013.html
Copyright © 2011-2022 走看看