2019河北省大学生程序设计竞赛(重现赛)- C 分治

题目链接:https://ac.nowcoder.com/acm/contest/903/C
题目大意:


思路:直接枚举攻打点,分成两个区间,进行分治就行了。记忆化递归。

#include<bits/stdc++.h>
#define LL long long

using namespace std;
const int maxn=2e5+10;

LL a[105];
LL dp[105][105];

LL dfs(int L, int R)
{
    if(dp[L][R]!=-1)
    {
        return dp[L][R];
    }
    if(R<=L)
    {
        return 0;
    }
    LL ans=((LL)1<<63)-1;
    for(int i=L;i<=R;i++)//枚举攻打点
    {
        ans=min(ans, dfs(L, i-1)+dfs(i+1, R)+(R-L)*a[i]);//分治
    }
    return dp[L][R]=ans;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        memset(dp, -1, sizeof(dp));
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        printf("%lld\n",dfs(1, n));
    }

    return 0;
}
全部评论

相关推荐

owwhy:难,技术栈在嵌入式这块显得非常浅,并且简历有大问题。教育经历浓缩成两行就行了,写什么主修课程,说的不好听这块没人在意,自我评价删了,项目写详细点,最终简历缩成一页。相关技能怎么说呢,有点差了,还写成这么多行
投了多少份简历才上岸
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务