题解:CF1945D Seraphim the Owl

题意

对于两个代价数组 aabb,一开始 i=ni=n,每次需要耗费 aia_{i}bib_{i} 的代价,使得 ii 的值减 11。当 iki\le k 且目前选择为 ai1a_{i-1} 时,可以停下并得到代价总值,求最小代价。

思路

考虑状态机动态规划的解法。

状态表示为 dpi,kdp_{i,k}

集合:考虑目前在 ii,决策是 kk 的集合,k=0k=0 表示选 aak=1k=1 表示选 bb

性质:最小值。

状态转移:目前的 ii 能由 i1i-1 选择而来。

  • dpi,0min(dpi+1,0,dpi+1,1)+aidp_{i,0}\gets\min(dp_{i+1,0},dp_{i+1,1})+a_{i}

  • dpi,1min(dpi+1,0,dpi+1,1)+bidp_{i,1}\gets\min(dp_{i+1,0},dp_{i+1,1})+b_{i}

由题可知,最终的答案为 min{dpi,0}min\{dp_{i,0}\},其中 1ik1\le i\le k

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;
}
posted @ 2024-03-21 20:22  PM_pro  阅读(16)  评论(0)    收藏  举报  来源