#include <iostream> #include <cstring> #include <algorithm> using namespace std; int main(){ int maxn=10005;//注意数组的边界 int T; cin>>T; while(T--){ int n,k; cin>>n>>k; long long array[maxn][3];//将两条路定义为一个二维数组 long long dp[maxn][15][3];//定义一个三维数组,第二位表示在换了J次路后的耗油量 int i,j; for(j=1;j<=2;j++) for(i=1;i<=n;i++) cin>>array[i][j]; memset(dp,0x7f,sizeof(dp));//初始化DP,且初始值要够大 dp[1][0][1]=array[1][1];//开始选择第一条路不需要进行换路,直接赋值 dp[1][0][2]=array[1][2]; for(i=2;i<=n;i++){ dp[i][0][1]=dp[i-1][0][1]+array[i][1]; //表示第一次换路后的情况 dp[i][0][2]=dp[i-1][0][2]+array[i][2]; for(j=1;j<=min(i,k);j++){ //接下来遍历所有换路不换路的情况 dp[i][j][1]=min(dp[i-1][j][1],dp[i-1][j-1][2])+array[i][1]; dp[i][j][2]=min(dp[i-1][j][2],dp[i-1][j-1][1])+array[i][2]; } } long long ans=100000000000000; for(j=0;j<=k;j++) ans=min(ans,min(dp[n][j][1],dp[n][j][2]));//由于题目给的最大耗油量够大,必须与题给的最大耗油量进行比较取最小值 cout<<ans<<endl; } return 0; }