题目1086:最小花费
#include <iostream>
using namespace std;
#define MAX 100000000000
typedef long long int64;
int64 l1,l2, l3, c1, c2, c3;
int64 arr[10000]; //存储i 到 i-1 的距离
int64 a,b;
int64 n;
int64 ans = MAX;
int64 cost[10000]; //存储最优花费
int64 getP(int64 l){
if(l == 0)
return 0;
else if(l <= l1)
return c1;
else if(l <= l2)
return c2;
else
return c3;
}
//从a到k的最优解,依赖于a到k-1的最优解。
void solve(int64 a,int64 b){
int64 len = b-a + 1;
for(int64 i=0; i<= len; i++)
cost[i] = MAX;
cost[0] = 0;
int64 tmp;
for(int i=a+1; i<=b; i++){
int64 k = i; //当前遍历到的位置
int64 cnt = 0;
int64 sum = arr[k];
//再往前遍历cnt个位置, 得到该位置的最优解
while(sum <= l3 && k-cnt > a){
cnt ++;
tmp = cost[k-a-cnt] + getP( sum );
if(cost[k-a] > tmp)
cost[k-a] = tmp;
sum += arr[i-cnt];
}
}
}
int main(){
while(cin >> l1 >> l2 >> l3 >> c1 >> c2 >> c3)
{
cin >> a >> b >> n;
if(a > b){
swap(a,b);
}
int64 pre = 0,cur;
for(int64 i=2; i<=n; i++)
{
cin >> cur;
arr[i] = cur - pre;
pre = cur;
}
if(a == b)
cout << 0 << endl;
else{
solve(a,b);
cout << cost[b - a] << endl;
}
}
return 0;
}
下面还有用Java写的递归版本。
import java.io.BufferedInputStream;
import java.util.Scanner;
public class Main{
static long L[] = new long [3];
static long P[] = new long [3];
static int station[] ;
public static void main(String[] args) {
Scanner s = new Scanner(new BufferedInputStream(System.in));
while(s.hasNextLong()){
for(int i=0; i<6; i++){
if(i>2)
P[i-3] = s.nextLong();
else
L[i] = s.nextLong();
}
int a = s.nextInt()-1;
int b = s.nextInt()-1;
int n = s.nextInt();
station = new int[n];
for(int i=1; i<n; i++)
station[i] = s.nextInt();
System.out.println(f(a,b));
}
}
private static long f(int a, int b) {
long len = station[b]-station[a];
if(b == a)
return 0;
else if(b-a == 1)
return getP(len);
else{
if(station[b]-station[b-1] < L[2])
return Math.min(f(a,b-1)+getP(station[b]-station[b-1]), f(a,b-2)+getP(station[b]-station[b-2]));
else
return f(a,b-1)+getP(station[b]-station[b-1]);
}
}
static long getP(long len){
if(len == 0)
return 0;
else if(len <= L[0])
return P[1];
else if(len <= L[1])
return P[1];
else
return P[2];
}
}