最小花费
2018-02-14 21:37
120 查看
时间限制:1秒 空间限制:65536K 热度指数:683 算法知识视频讲解
//#include "stdafx.h"
#include"stdio.h"
#include<iostream>
using namespace std;
//typedef long long ll;
int l1,l2,l3,c1,c2,c3,a,b,n;
int *d;
int l;
int cal(int l){
if(l<=l1)return c1;
else if(l<=l2)return c2;
else if(l<=l3)return c3;
else return c3*n;
}
int main(){
//freopen("c://jin.txt","r",stdin);
while(cin>>l1>>l2>>l3>>c1>>c2>>c3>>a>>b>>n){
d=new int
;
d[1]=0;
for(int i=2;i<=n;i++){
cin>>d[i];
}
if(a>b)swap(a,b);
l=d[b]-d[a];
int ans;
if(b-a==1){
ans=cal(l);//如果ab是相邻的车站
}
else{
int **dp=new int*[n+1];//如果ab不相邻
for(int i=1;i<=n;i++)
dp[i]=new int[n+1];
for(int i=1;i<=n;i++){
dp[i][i]=0;
for(int j=i+1;j<=n;j++)
{dp[i][j]=n*c3;}}//车站间的花费刚开始都设为最大
for(int i=a;i<b;i++){dp[i][i+1]=cal(d[i+1]-d[i]);//计算相邻车站的花费
}
for(int len=2;len<=b-a;len++)//计算车站间隔为len的两个车站之间的最少花费
for(int i=a;i+len<=b;i++){
dp[i][i+len]=cal(d[i+len]-d[i]);//计算中途不停车从a开到b的花费作为初始值,如果距离大于l3,则设为不可达,即花费最大
for(int k=i+1;k<i+len;k++)//挑选一个中间的车站
{dp[i][i+len]=min(dp[i][i+len],dp[i][k]+dp[k][i+len]);//动态规划,保留最小花费
}}
ans=dp[a][b];
}
cout<<ans<<endl;
}
//freopen("CON","r",stdin);
//system("pause");
return 0;
}
题目描述
在某条线路上有N个火车站,有三种距离的路程,L1,L2,L3,对应的价格为C1,C2,C3.其对应关系如下: 距离s 票价 0<S<=L1 C1 L1<S<=L2 C2 L2<S<=L3 C3 输入保证0<L1<L2<L3<10^9,0<C1<C2<C3<10^9。 每两个站之间的距离不超过L3。 当乘客要移动的两个站的距离大于L3的时候,可以选择从中间一个站下车,然后买票再上车,所以乘客整个过程中至少会买两张票。 现在给你一个 L1,L2,L3,C1,C2,C3。然后是A B的值,其分别为乘客旅程的起始站和终点站。 然后输入N,N为该线路上的总的火车站数目,然后输入N-1个整数,分别代表从该线路上的第一个站,到第2个站,第3个站,……,第N个站的距离。 根据输入,输出乘客从A到B站的最小花费。输入描述:
以如下格式输入数据: L1 L2 L3 C1 C2 C3 A B N a[2] a[3] …… a
输出描述:
可能有多组测试数据,对于每一组数据, 根据输入,输出乘客从A到B站的最小花费。示例1
输入
1 2 3 1 2 3 1 2 2 2
输出
2动态规划问题// pat.cpp : 定义控制台应用程序的//#include "stdafx.h"
#include"stdio.h"
#include<iostream>
using namespace std;
//typedef long long ll;
int l1,l2,l3,c1,c2,c3,a,b,n;
int *d;
int l;
int cal(int l){
if(l<=l1)return c1;
else if(l<=l2)return c2;
else if(l<=l3)return c3;
else return c3*n;
}
int main(){
//freopen("c://jin.txt","r",stdin);
while(cin>>l1>>l2>>l3>>c1>>c2>>c3>>a>>b>>n){
d=new int
;
d[1]=0;
for(int i=2;i<=n;i++){
cin>>d[i];
}
if(a>b)swap(a,b);
l=d[b]-d[a];
int ans;
if(b-a==1){
ans=cal(l);//如果ab是相邻的车站
}
else{
int **dp=new int*[n+1];//如果ab不相邻
for(int i=1;i<=n;i++)
dp[i]=new int[n+1];
for(int i=1;i<=n;i++){
dp[i][i]=0;
for(int j=i+1;j<=n;j++)
{dp[i][j]=n*c3;}}//车站间的花费刚开始都设为最大
for(int i=a;i<b;i++){dp[i][i+1]=cal(d[i+1]-d[i]);//计算相邻车站的花费
}
for(int len=2;len<=b-a;len++)//计算车站间隔为len的两个车站之间的最少花费
for(int i=a;i+len<=b;i++){
dp[i][i+len]=cal(d[i+len]-d[i]);//计算中途不停车从a开到b的花费作为初始值,如果距离大于l3,则设为不可达,即花费最大
for(int k=i+1;k<i+len;k++)//挑选一个中间的车站
{dp[i][i+len]=min(dp[i][i+len],dp[i][k]+dp[k][i+len]);//动态规划,保留最小花费
}}
ans=dp[a][b];
}
cout<<ans<<endl;
}
//freopen("CON","r",stdin);
//system("pause");
return 0;
}
相关文章推荐
- 最小花费路径 MST+LCA
- 最小花费_ssl2206_dijkstra
- 福州大学第十二届程序设计竞赛-H - 最小花费
- hdoj 3072 Intelligence System【求scc&&缩点】【求连通所有scc的最小花费】
- 九度 oj 题目1086:最小花费
- 2017-5-14 湘潭市赛 Parentheses 转化思想+贪心 使括号序列合法的最小花费。满足前面左括号的数量>=有括号的数量。
- HDU 1102 Constructing Roads(Kruskal最小生成树求最小花费)
- 最小花费
- 题目1086:最小花费
- PTA 5-25 畅通工程之局部最小花费问题
- Tour HDU - 3488(带权二分匹配)(最小花费最大流)
- 畅通工程之局部最小花费问题(prime算法)
- 洛谷-1576 最小花费
- 洛谷 1576 最小花费
- 【codeforces 675E】【DP+线段树维护】【给出n个车站,并告诉你第i个车站有从i+1到a[i]个车站的直达票,问你所有车站到其余各个车站的最小车票花费和】
- luoguP1576 最小花费
- uestc599最小花费【单调队列优化dp】
- ssl2206 最小花费
- money 最小花费(spfa)
- HDU-3790 最短路最小花费