• 分治 (2019 河北省赛) (区间dp)


    链接:https://ac.nowcoder.com/acm/contest/903/C
    来源:牛客网
     

    题目描述

    你是DEEP国的大军师,辅佐一个非常有野心的国王,这位国王非常有野心,他计划攻占 n 个国家。在地图上,这些国家排成一行。

    探子已经查明,当攻打一个国家 i 时,为了防止国家间的联合对抗,需要给该国家周围,所有未被攻占的国家支付costicosti 个金币,即对于国家 i,它左侧第一个已被攻打的国家为 l,右侧第一个已被攻打的国家为 r,则他需要给[l+1,i-1] 和 [i+1,r-1] 之间的国家支付金币。如果 l 不存在,则需要给 [1, i-1] 之间的所有国家支付金币;若 r 不存在,则需要给 [i+1,n] 之间的所有国家支付金币。

    现在,你的下属已经给你提供了每个国家需要支付金币的数量。为了满足国王的野心,你需要计算出攻占完所有国家需要的最小花费。

    输入描述:

    第一行是一个整数 T,代表接下来有T组数据。
    接下来每组数据
    第一行有一个整数 n,代表要攻占的国家数目。
    第二行共 n 个整数,代表攻占每个国家前,需要支付给其周围未被攻占国家 costicosti个金币。
    1≤T≤501≤T≤50,1≤n≤1001≤n≤100,1≤costi≤100001≤costi≤10000

    输出描述:

    对于每组数据输出一行,代表需要支付的最小花费。

    示例1

    输入

    复制

    2
    1
    1
    3
    1 1 2

    输出

    复制

    0
    2

    说明

    3
    1 1 2
    先打中间这个1 给左右两个各1块钱
    再打左右两个 不用花钱

    典型的区间dp

    对于每个区间枚举最先选的那个点

    #include<bits/stdc++.h>
    using namespace std;
    int c[100005];
    int dp[105][105];
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int n;
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    if(j<i) dp[i][j]=0;
                    else dp[i][j]=1e9;
                }
            }
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&c[i]);
            }
            //[]
            for(int len=0;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(c[k]*(j-i)+dp[i][k-1]+dp[k+1][j],dp[i][j]);
                    }
                }
            }
            printf("%d
    ",dp[1][n]);
        }
    }
    
  • 相关阅读:
    51nod 1087 1 10 100 1000(找规律+递推+stl)
    51nod 1082 与7无关的数 (打表预处理)
    51 nod 1080 两个数的平方和
    1015 水仙花数(水题)
    51 nod 1003 阶乘后面0的数量
    51nod 1002 数塔取数问题
    51 nod 1001 数组中和等于K的数对
    51 nod 1081 子段求和
    51nod 1134 最长递增子序列 (O(nlogn)算法)
    51nod 1174 区间中最大的数(RMQ)
  • 原文地址:https://www.cnblogs.com/caowenbo/p/11852257.html
Copyright © 2020-2023  润新知