题解:CF1945D Seraphim the Owl
题意
对于两个代价数组 与 ,一开始 ,每次需要耗费 或 的代价,使得 的值减 。当 且目前选择为 时,可以停下并得到代价总值,求最小代价。
思路
考虑状态机动态规划的解法。
状态表示为 。
集合:考虑目前在 ,决策是 的集合, 表示选 , 表示选 。
性质:最小值。
状态转移:目前的 能由 选择而来。
由题可知,最终的答案为 ,其中 。
Code
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
#define int unsigned long long
using namespace std;
const int N=1e5*2+10;
int f[N][2];
int a[N],b[N];
signed main()
{
int t;
cin>>t;
while(t--)
{
memset(f,0,sizeof f);
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++) {
cin>>a[i];
}
for(int i=1;i<=n;i++) {
cin>>b[i];
}
for(int i=n;i>=1;i--)
{
f[i][0]=min(f[i+1][1],f[i+1][0])+a[i];
f[i][1]=min(f[i+1][1],f[i+1][0])+b[i];
}
int minn=0x3f3f3f3f3f3f3f3f;
for(int i=1;i<=k&&i<=n;i++)
{
minn=min(minn,f[i][0]);
}
cout<<minn<<endl;
}
return 0;
}

浙公网安备 33010602011771号