E - Let's Go Rolling!

题目描述:数轴上有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+1−xj)

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
long long x,c;
}ren[];
long long dp[][];
bool cmp(node a,node b)
{
return a.x<b.x;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%lld%lld",&ren[i].x,&ren[i].c);
}
sort(ren+,ren++n,cmp);
memset(dp,,sizeof dp);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
dp[i][j]=;
dp[][]=ren[].c;
for(int i=;i<n;i++)
{
for(int j=;j<=i;j++)
{
dp[i+][j]=min(dp[i+][j],dp[i][j]+ren[i+].x-ren[j].x);
dp[i+][i+]=min(dp[i+][i+],dp[i][j]+ren[i+].c); } }
long long mn=;
for(int i=;i<=n;i++)
mn=min(mn,dp[n][i]);
printf("%lld\n",mn);
return ;
}
上一篇:Java8从入门到上手


下一篇:Python 学习 第三天 课后总结: