zoukankan      html  css  js  c++  java
  • hdu 4283 区间dp

    题意:开始一个序列,每个人有一个愤怒值D,如果他是第K个上场,不开心指数就为(K-1)*D。

    但可以我们可以用一个小黑屋(栈)调整顺序,这样求出最后最小的愤怒值之和

    思路:区间dp dp[i][j]代表从i到J的愤怒值。

    由于有栈作为顺序调整,那么i 可以是第[1,j-i+1]个登场。

    假设它作为第k个登场了,那么[i+1,k]已经全出场了。因为栈的性质啊。

    所以这样就可以区间dp了 dp[i][j] =min(dp[i][j],dp[i+1][k]+dp[k+1]j]+..)

    但由于每个人根据出场顺序会有影响,那么要将 d[i]愤怒 和 [k+1,j]的愤怒加上

    这样用前缀数组处理下。

    #include<bits/stdc++.h>
    using namespace std;
    
    #define ll long long
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define all(v) v.begin(),v.end()
    #define mem(a) memset(a,0,sizeof(a))
    
    const int N = 102;
    const ll mod =1e9+7;
    const int INF = 1e9+4;
    const double eps = 1e-7;
    
    ll a[N];
    ll dp[N][N];
    ll sum[N];
    
    int main(){
        int t;
        cin>>t;
        int cnt= 0;
        while(t--){
            int n;
            cin>>n;
            for(int i=1;i<=n;++i)cin>>a[i];
            for(int i=1;i<=n;++i){
                for(int j=i+1;j<=n;++j)
                    dp[i][j]=INF;
            }
            for(int i=1;i<=n;++i)
                sum[i] = sum[i-1]+a[i];
    
            for(int len=1;len<n;++len){
                for(int i=1;i+len<=n;++i){
                    int j =i+len;
                    for(int k=i;k<=j;++k){
                        dp[i][j] =min(dp[i][j],a[i]*(k-i) + (k-i+1)*(sum[j]-sum[k])+dp[i+1][k]+dp[k+1][j]);
                    }
                }
            }
            printf("Case #%d: %d
    ",++cnt,dp[1][n]);
        }
        return 0;
    }
  • 相关阅读:
    eclipse(java windows)
    Tomcat(Linux)
    Tomcat(Windows)
    MySql(Windows)
    Java EE API
    计算机网络-TCP三次握手理解
    onclick 和click 的区别
    js轮播图代码
    JS轮播图制作
    js动画原理
  • 原文地址:https://www.cnblogs.com/wjhstudy/p/10305909.html
Copyright © 2011-2022 走看看