AGC004B Colorful Slimes
  kgNvaGSWJ8xL 2023年11月02日 40 0
C++

$ {\scr \color {Orchid}{\text{生于尘埃,溺于人海,死于理想高台。}}} $

题目链接:Colorful Slimes

$ {\scr \color {Cyan}{\text{Solution}}} $

分析

思路:挺神奇的$dp$

一个比较显然的结论:最小值的方案中第$2$种操作最多用$n-1$次

证明大概就是一个数用$n-1$次一定会变成另一个数

下面说说$dp$的思路:

$dp[i][j]$表示能用最多$j$次第$2$种操作能变成$a_i$的最小值

假设$a_k$所有可以用最多$j$次第$2$种操作能变成$i$的最小值,则$dp[i][j]=a_k$

举个栗子:

3 1 4 

对于这个$4$来说,用最多$2$次操作能变成坐标为$3$的数最小值,就是$1$

 

如果能理解定义了,那我们接着往下看:

$dp$递推其实并不难,取个$min$比较就行

统计答案怎么做?

我们可以枚举用了几次$2$的操作,后直接相加$dp[1...n][j]$即可

这也是为什么定义方程是“用了j次及以下”的关键qwqq

Code:

//From:201929
#include<bits/stdc++.h>
#define L long long
using namespace std;
L a[2005],dp[2005][2005];
int main()
{
    int n;
    L x;
    scanf("%d%lld",&n,&x);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    for(int i=1;i<=n;i++)
    {
        dp[i][0]=a[i];
        for(int j=1;j<n;j++)
        {
            int k=i-j;
            if(k<=0) k+=n;
            dp[i][j]=min(dp[i][j-1],a[k]);
        }
    }
    L minn=1e18+5;
    for(int i=0;i<n;i++)
    {
        L summ=x*i;
        for(int j=1;j<=n;j++) summ+=dp[j][i];
        minn=min(minn,summ);
    }
    printf("%lld",minn);
    return 0;
}

 

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  8Tw5Riv1mGFK   2024年05月01日   77   0   0 C++
  BYaHC1OPAeY4   2024年05月08日   54   0   0 C++
  yZdUbUDB8h5t   2024年05月05日   41   0   0 C++
  oXKBKZoQY2lx   2024年05月17日   54   0   0 C++
kgNvaGSWJ8xL