weixin_41429120 2021-05-09 14:23 采纳率: 34.6%
浏览 77
已结题

请教一下这道C++题,NOIP,急急急 加急

  • 写回答

4条回答 默认 最新

  • 白驹_过隙 算法领域新星创作者 2021-05-09 14:45
    关注
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <iostream>
    #define INF 0x3f3f3f3f
    using namespace std;
    
    const int maxn=330;
    int dp[maxn][maxn];
    int a[maxn];
    int dis[maxn][maxn];//dis[i][j]表示在第i个村和第j个村之间建一个邮局的“代价”
    
    int main()
    {
        int n,m;
        while(~scanf("%d%d",&n,&m))
        {
            for(int i=1;i<=n;i++)
                scanf("%d",&a[i]);
            //预处理dis[i][j]
            for(int i=1;i<=n;i++)
                for(int j=i+1;j<=n;j++)
            {
    
                //显然在[i,j]放一个邮局,放在最中间是最优的
                dis[i][j]=dis[i][j-1]+a[j]-a[(i+j)/2];
            }
            for(int i=1;i<=n;i++)
            {
                dp[i][i]=0;
                dp[i][1]=dis[1][i];
            }
            for(int j=2;j<=m;j++)
            {
                for(int i=j+1;i<=n;i++)
                {
                    dp[i][j]=INF;
                    for(int k=j-1;k<i;k++)
                    {
                        dp[i][j]=min(dp[i][j],dp[k][j-1]+dis[k+1][i]);
                    }
                }
            }
            printf("%d\n",dp[n][m]);
        }
        return 0;
    }
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘