警示后人
查看原帖
警示后人
748437
AirQwQ楼主2023/8/6 20:23

虽然所谓评测鸡强大,但是写丑了照样T

以我的憨憨代码为例

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,m,s[3005],a[3005];
int dp[3005][105],ans;
int val(int l,int r){return (r-l-1)*(r-l)/2*max(a[l],a[r])+a[r]*a[r];}
signed main() {
	int flag=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>s[i];
		if(s[i]==0) flag=i;
	}
	for(int i=flag;i<=n;i++)
		a[i-flag+1]=s[i];
	for(int i=1;i<flag;i++)
		a[n-flag+i+1]=s[i];
	memset(dp,0x3f,sizeof dp),dp[1][1]=0;
	for(int i=1;i<=n;i++)
		for(int j=2;j<=min(i,m);j++)
			for(int k=1;k<i;k++)
				dp[i][j]=min({dp[i][j],dp[k][j-1]+val(k,i),dp[k][j==m?j:j-1]+val(k,i)});
	int ans=2e9;
	for(int i=1;i<=n;i++)
		ans=min(ans,dp[i][m]+val(i,n+1));
	cout<<ans;
	return 0;
}

https://www.luogu.com.cn/record/119381829 T飞起来

所以几个卡常:

  1. 加inline,我的加了直接过.

  2. /2写成>>1

  3. max{a,b,c}很慢,不要为压行写一排,老实if快得多

4.for(int j=2;j<=min(i,m);j++)这里,改成j<=i&&j<=m

希望对你有帮助QwQ

2023/8/6 20:23
加载中...