动态规划。
一道完全自己想然后看了眼别人给的样例测试了一下程序的题。。。。。。
题的意思就是有许多站台,给出的距离是距离第一个的,然后一个长度一个价钱,问从一个站台到另一个站台需要的最小费用
动态规划嘛。。。
写的是n^2的,,应该有n的。。。。注意给的起点终点的大小关系!!!
#include<stdio.h>记得开LONG LONG
#include<string.h>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
long long int a[10001];
long long int dp[10001]={0};
int main()
{
long long int l1,l2,l3,c1,c2,c3;
scanf("%lld%lld%lld%lld%lld%lld",&l1,&l2,&l3,&c1,&c2,&c3);
int num;
scanf("%d",&num);
int qi,zhong;
scanf("%d %d",&qi,&zhong);
if(qi>zhong) swap(qi,zhong);
int i,j;
for(i=2;i<=num;i++) scanf("%lld",&a[i]);
for(i=qi;i<=zhong;i++)
{
long long int t=a[i]-a[i-1];
if(t<=l1) dp[i]=dp[i-1]+c1;
if(t>l1&&t<=l2) dp[i]=dp[i-1]+c2;
else dp[i]=dp[i-1]+c3;
}
dp[qi]=0;
for(i=qi;i<=zhong;i++)
{
for(j=1;j<=i-1;j++)
{
//if(j<qi) break;
int juli=a[i]-a[j];
if(juli<=l3)
{
if(juli<=l2)
{
if(juli<=l1) {dp[i]=min(dp[j]+c1,dp[i]); }
else dp[i]=min(dp[i],dp[j]+c2);
}
else dp[i]=min(dp[i],dp[j]+c3);
}
}
}
//for(i=1;i<=zhong;i++) printf("%d ",dp[i]);
printf("%lld\n",dp[zhong]);
return 0;
}
再给一个大神写的吧。。。。。。。15ms...
#include <stdio.h>
long w[10000]={0},f[100000]={0};
int main()
{
long i,s,t,n,l1,l2,l3,c1,c2,c3,s1,s2,s3;
int min(int,int);
scanf("%ld %ld %ld %ld %ld %ld*",&l1,&l2,&l3,&c1,&c2,&c3);
scanf("%ld*",&n);
scanf("%ld %ld*",&s,&t);
if (s>t) s=s+t,t=s-t,s=s-t;
for (i=2;i<=n;i++)
scanf("%d*",&w[i]);
s1=s,s2=s,s3=s;
for (i=s+1;i<=t;i++)
{
while (w[i]-w[s1]>l1) s1++;
while (w[i]-w[s2]>l2) s2++;
while (w[i]-w[s3]>l3) s3++;
if(s1<i)
f[i]=min(min(f[s1]+c1,f[s2]+c2),f[s3]+c3);
else
if (s2<i) f[i]=min(f[s2]+c2,f[s3]+c3);
else
f[i]=f[s3]+c3;
}
printf("%ld",f[t]);
return 0;
}
int min(int s1,int s2)
{
if (s1<s2) return s1;
else return s2;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。