P4953 [USACO02FEB] Cow Cycling

洛谷

一眼动态规划。

但是我们状态怎么设置?

我们分析题目,可以发现一个领头一定要开到最后,不再成为领头。

原因很简单,如果你把这只领队重新放回队尾,那么它在其它奶牛领队后跑了几圈,它最后能跑的圈数比其他没有跑过的少得更多,自然是希望在前面跑完以后就不再领跑。

这样我们就简化了题目,目前需要记录已经领跑了的奶牛数量以及跑了的圈数和目前领队的电量。

那么状态设计完成了,方程怎么转移?

三个状态分析起来对于我这种蒟蒻来说还是太难了,所以我选择无脑记搜。

只需要考虑是选择继续作为领队还是换一个领队和跑的圈数即可。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,s,dp[25][105][105];
bool vis[25][105][105];
int dfs(int p,int x,int z){
	if(x>=s)return 0;
	if(p>n)return 1e9;
	if(vis[p][x][z])return dp[p][x][z];
	vis[p][x][z]=1;
	int &res=dp[p][x][z];
	for(int i=1;i*i<=z&&x+i<=s;i++){
		res=min(res,dfs(p,x+i,z-i*i)+1);
		res=min(res,dfs(p+1,x+i,m-x-i)+1);
	}
	return res;
}
signed main(){
	memset(dp,0x3f,sizeof(dp));
	cin>>n>>m>>s;
	cout<<dfs(1,0,m);
	return 0;
}

所以这怎么有紫?

posted @ 2025-12-07 12:45  huhangqi  阅读(2)  评论(0)    收藏  举报