笔记 Building Shops

本文探讨了基于动态规划(DP)的糖果屋选址问题,通过定义dp[i][0]和dp[i][1]分别表示第i处是否建造的状态,采用类似01背包的思路,实现了最小化成本的目标。文章详细解释了算法流程,并附带C++实现代码。

题意一开始都没看懂…
意思是造糖果屋,有造和不造两种选择。
造ai,ans+ci,不造,ans+d(此处与它最左边一个糖果屋);
很像01背包。所以定义dp状态 dp[ i ][ 0 ] 和dp[ i ] [ 1 ]分别代表i处造or不造的状态。
最后的答案是在造与不造之间决策,(ans=min(dp[ n ] [ 0 ] , dp[ n ][ 1 ])
看到好多种方法,慢慢研究

  1. 法(一)
#include <iostream>
#include <algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
struct p{
//注意数据范围啊!老是被坑
 long long int x, c;
};
//给的数据没有排好序
bool cmp(p p1,p p2){
 return p1.x<p2.x;
}
int n;
//dp数组
long long dp[3001][2];
p a[3001];
int main(){
 while(cin >> n){
  memset(dp,0,sizeof(dp));
  memset(a,0,sizeof(a));
  for(int i=1;i<=n;i++){
   cin>> a[i].x >> a[i].c;
  }
  sort(a+1,a+1+n,cmp);
  //最左边一定要造一个,也就是第一个
  dp[1][1] = a[1].c; 
  //dp[ i ] [ 0 ]代表i处不建造的情况,初始化为inf:因为后面要根据dp[i -1][ 0 or 1 ]的情况推导
  dp[1][0]=inf;
  for(int i=2;i<=n;i++){
  //判断i处建造的最优解:由前一个的最优状态得到
   dp[i][1]=min(dp[i-1][0],dp[i-1][1])+ a[i].c;
   dp[i][0]=inf;
   long long sum=0;
   for(int j=i-1;j>=1;j--){
   //sum是用来计算距离总和的
   /*
   已知i处不建
   j枚举的最近糖果屋,每段都算了一次,
   比如
   j=i-1时,1*d(a[i],a[i-1]) i~i-1算了一次
   j=i-2时,2*d(a[i-1],a[i-2]) i~i-2算了一次,i-1~i-2算了一次
   依此类推,可计算得到总和 
   节省时间   一个很有意思的想法,像数列求和时用的
   s1+s2+s3+...+sn = a1*n+ a2 *(n-1) + a3*(n-2)+...+an一样的想法,不用再分别计算s1到sn的值了
   适用于排好序的情况
   */
    sum += (i-j)*(a[j+1].x - a[j].x);
    //不断更新,得到i处不建时的最优解,也就是找到最合适的j作为离它最近的糖果屋,来使cost最小
    dp[i][0]=min(dp[j][1]+sum,dp[i][0]);
  }
  }
  long long ans = min(dp[n][1],dp[n][0]);
  cout<< ans <<endl; 
  }
}
好的,我可以给你一些指导来创建和使用shops数据库。 首先,你需要安装一个关系型数据库管理系统(RDBMS),例如MySQL、PostgreSQL或Microsoft SQL Server。这些RDBMS都提供了创建和管理数据库的工具。 一旦你安装了RDBMS,你可以使用SQL(结构化查询语言)来创建数据表和插入数据。下面是一个示例的SQL代码来创建一个名为“shops”的数据库: ``` CREATE DATABASE shops; ``` 接下来,你可以创建一个名为“products”的表来存储商品信息,例如商品名称、价格和库存量。下面是一个示例的SQL代码: ``` CREATE TABLE products ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL, price DECIMAL(10,2) NOT NULL, stock INT NOT NULL, PRIMARY KEY (id) ); ``` 这将创建一个名为“products”的表,其中包含四个列:id、name、price和stock。id列是自动增量的主键,确保每个商品都有一个唯一的标识符。name列存储商品名称,price列存储商品价格,stock列存储商品库存量。 一旦你创建了“products”表,你可以使用INSERT语句向表中插入数据。例如,下面是一个示例的SQL代码来插入一些商品信息: ``` INSERT INTO products (name, price, stock) VALUES ('T-shirt', 19.99, 100), ('Jeans', 49.99, 50), ('Sneakers', 79.99, 25); ``` 这将向“products”表中插入三个商品,分别是T-shirt、Jeans和Sneakers,每个商品都有一个价格和库存量。 一旦你向表中插入了数据,你可以使用SELECT语句来查询数据。例如,下面是一个示例的SQL代码来查询所有商品的名称和价格: ``` SELECT name, price FROM products; ``` 这将返回一个结果集,其中包含所有商品的名称和价格。 当然,这只是一个简单的示例,你可以根据自己的需求创建更复杂的表和查询。希望这些指导可以帮助你创建和使用shops数据库。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值