VIJOS-P1421 更换轮胎
JDOJ 1506: VIJOS-P1421 更换轮胎
https://neooj.com/oldoj/problem.php?id=1506
Description
经过数周的期待,比赛终于正式开始。 不过天公不作美,今天的天气十分诡异,一会儿下雨,一会儿刮风。要知道,天气的变化对F1比赛的影响是巨大的,恶劣的天气甚至会严重干扰赛车手发挥。因此,各车队的总指挥都会在赛前根据赛道环境和天气的变化为车手制定一系列周密的计划。幸运的是,F1专用气象站拥有最顶尖的技术,能够精确测量出每一圈的天气情况,这大大降低了计划的风险。 在计划中,对轮胎的正确选择是至关重要的。每一场比赛,赛会都会提供给各赛车不同总类的轮胎(每种轮胎数量不限)。出发时,各赛车可根据需要使用任意一种轮胎。以后每过一圈,赛车可以选择不更换轮胎继续前进,或者进维修站更换任一种轮胎,但需要消耗一定的换胎时间。 通过测试,换胎时间和各种轮胎在各圈所消耗的单圈时间已精确测出,你能帮车队求出完成比赛的最短时间么?
Input
第一行是三个整数n,m,c(1< =n< =1000,1< =m< =1000,1< =c< =1000000),分别表示总圈数,轮胎种类数和换胎时间。接下来n行,每行m个整数,第i行第j个是tij(1< =tij< =1000000),表示在第i圈时第j种轮胎所消耗的单圈时间。
Output
一个整数s,表示最短的总时间。
Sample Input
【样例输入】 4 3 30 50 60 100 70 50 100 10 50 90 100 30 10
Sample Output
【样例输出】 170
HINT
30%的数据满足n< =15,m< =2
动态规划的一道题。(脑补了很多评价但是没有说出来)
输入没问题。
状态就设置dp[i][j]为第i圈第j种轮子的最小时间。
然后我们再考虑设置一个变量mint,存上一圈的最小值。(动归中要用,注意这里的最小值跟轮子没关系)
剩下的我不解释了,看代码把。
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n,m,c,mint,ans; int t[1001][1001]; int dp[1001][1001]; int main() { scanf("%d%d%d",&n,&m,&c); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&t[i][j]); memset(dp,0x3f,sizeof(dp)); mint=1000000000; for(int i=1;i<=m;i++) dp[1][i]=t[1][i]; for(int i=2;i<=n;i++) { mint=1000000000; for(int k=1;k<=m;k++) mint=min(mint,dp[i-1][k]); for(int j=1;j<=m;j++) dp[i][j]=min(dp[i-1][j],mint+c)+t[i][j]; } ans=1000000000; for(int i=1;i<=m;i++) ans=min(ans,dp[n][i]); printf("%d",ans); return 0; }