zoukankan      html  css  js  c++  java
  • E

    题目描述:数轴上有nn个质点,第ii个质点的坐标为xixi,花费为cici,现在要选择其中一些点固定,代价为这些点的花费,固定的点不动,不固定的点会向左移动直至遇到固定的点,代价是这两点的距离,如果左边没有固定的点则花费为正无穷,问最小代价。

    动态规划。

    dp[i][j];       i表示第i个格子; j就是最后一个被固定的质点;

    dp[i+1][i+1]=min(dp[i+1][i+1],dp[i][j]+ci+1)

    dp[i+1][j]=min(dp[i+1][j],dp[i][j]+xi+1xj)

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    struct node
    {
        long long x,c;
    }ren[3010];
    long long  dp[3010][3010];
    bool cmp(node a,node b)
    {
        return a.x<b.x;
    }
    int main()
    {
       int n;
       scanf("%d",&n);
       for(int i=1;i<=n;i++)
       {
           scanf("%lld%lld",&ren[i].x,&ren[i].c);
       }
       sort(ren+1,ren+1+n,cmp);
        memset(dp,0,sizeof dp);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                dp[i][j]=10000000000;
       dp[1][1]=ren[1].c;
        for(int i=1;i<n;i++)
        {
            for(int j=1;j<=i;j++)
        {
            dp[i+1][j]=min(dp[i+1][j],dp[i][j]+ren[i+1].x-ren[j].x);
            dp[i+1][i+1]=min(dp[i+1][i+1],dp[i][j]+ren[i+1].c);
    
        }
    
        }
        long long  mn=10000000000;
        for(int i=1;i<=n;i++)
            mn=min(mn,dp[n][i]);
       printf("%lld
    ",mn);
       return 0;
    }
  • 相关阅读:
    2-4安卓自学
    2-3安卓自学
    2-2安卓自学
    2-1安卓自学
    20210121 Sqlit数据库
    20210119 Sqlit数据库
    20210118 android学习
    20210117 android学习
    20210115 android学习
    20210114 android学习
  • 原文地址:https://www.cnblogs.com/2014slx/p/8716648.html
Copyright © 2011-2022 走看看