时间限制: 1 Sec 内存限制:128 MB
汪老司机行走的路线:a1 -> b2 -> a3 -> b4 -> a5 -> b6
思路:简单DP。 Word is too cold,show you my code。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <iostream> // C++头文件,C++完全兼容C #include <algorithm> // C++头文件,C++完全兼容C #define fre freopen("in.txt","r",stdin) //以文件代替控制台输入,比赛时很常用,能缩短输入测试样例的时间 #define INF 0x3f3f3f3f #define inf 1e60 using namespace std; // C++头文件,C++完全兼容C #define N 10005 // 宏定义 #define LL long long //宏定义 LL dp[N][2][15]; //第一个[]表示走到第几格,第二个[]表示第几行(0 或 1),第三个[]表示已经进行了几次换道 //其实第一个[]完全可以省略,因为进行操作的都是当前路段和前1个路段 int a[N],b[N]; //记录每条道的值 int main(){ //fre; int t; scanf("%d",&t); //测试样例数 while(t--){ int n,k; scanf("%d%d",&n,&k); memset(dp,INF,sizeof(dp)); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&b[i]); dp[0][0][0] = dp[0][1][0] = dp[0][0][1] = dp[0][1][1] = 0; //一开始第0段路置为0 for(int i=1; i<=n; i++){ int top = min(k-1,i-1); //需要进行动态规划的变道次数 dp[i][0][0] = dp[i-1][0][0] + a[i]; //第0条路,从未变道 dp[i][1][0] = dp[i-1][1][0] + b[i]; //第1条路,从未变道 for(int j=0; j<=top; j++){ dp[i][0][j+1] = min(dp[i-1][0][j+1] + a[i], dp[i-1][1][j] + a[i]); //见图片解析 dp[i][1][j+1] = min(dp[i-1][1][j+1] + b[i], dp[i-1][0][j] + b[i]); //见图片解析 } } LL ans = inf; for(int i=0;i<=k;i++){ //最后将第n段路的所有状态取最小值 ans = min(ans, dp[n][0][i]); ans = min(ans, dp[n][1][i]); } printf("%lld\n",ans); } }
