留忆

\(update:2025/7/17\)

模拟退火

P3052 [USACO12MAR] Cows in a Skyscraper G

随机化真神算法

退火+贪心=状压DP

随机数(糖)

//May all the beauty be blessed.
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,maxp,w;
struct aa{
	int ap,bp,as,bs;
	aa(int ap=0,int bp=0,int as=0,int bs=0):
		ap(ap),bp(bp),as(as),bs(bs){};
}a[2010];
int dp[2010][2010],ans;

deque<pair<int,int> > q[2010][2];
signed main(){
	ios::sync_with_stdio(0);
	cout.tie(0);cin.tie(0);
	cin>>t>>maxp>>w;
	for(int i=1;i<=t;i++) cin>>a[i].ap>>a[i].bp>>a[i].as>>a[i].bs;
	for(int i=0;i<=t;i++) for(int j=0;j<=maxp+1;j++) dp[i][j]=-0x7f7f7f7f;
	dp[0][0]=0;
	
	for(int i=1;i<=t;i++){
		for(int j=0;j<=a[i].as;j++) dp[i][j]=-j*a[i].ap;
		for(int j=0;j<=maxp;j++) dp[i][j]=max(dp[i][j],dp[i-1][j]);
		
		if(i-w-1>=0){
			for(int j=0;j<=maxp;j++){
				dp[i][j]=max(dp[i][j]+j*a[i].ap,q[j][0].front().first)-j*a[i].ap;
			}
			for(int j=0;j<=maxp;j++){
				dp[i][j]=max(dp[i][j]+j*a[i].bp,q[j][1].front().first)-j*a[i].bp;
			}
		}
		for(int j=0;j<=maxp;j++){
			if(q[j][0].empty()||q[j][0].back().first<dp[i][j]+j*a[i].ap) q[j][0].push_back({dp[i][j]+j*a[i].ap,i});
			if(q[j][1].empty()||q[j][1].back().first<dp[i][j]+j*a[i].bp) q[j][1].push_back({dp[i][j]+j*a[i].bp,i});
		}
		
		for(int j=0;j<=maxp;j++){
			if(q[j][0].size()==1) continue;
			auto x=q[j][0].front();
			q[j][0].pop_front();
			if(q[j][0].front().second>i-w) q[j][0].push_front(x);
			else j--; 
		}
	}
//	for(int i=0;i<=t;i++){
//		for(int j=0;j<=maxp;j++) cout<<dp[i][j]<<" ";
//		cout<<'\n';
//	}
	for(int i=0;i<=maxp;i++) ans=max(ans,dp[t][i]);
	cout<<ans;
}

P 2569

状压DP

模版 P1433
抽象版

//May all the beauty be blessed.
#include<bits/stdc++.h>
//#define int long long
using namespace std;
int n;
double s[20][2],a[20][20],dp[1<<20][20],ans;
queue<int> q;
bool v[1<<16];
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>s[i][0]>>s[i][1];
	for(int i=0;i<=n;i++){
		for(int j=0;j<=n;j++){
			a[i][j]=sqrt((s[i][0]-s[j][0])*(s[i][0]-s[j][0])+(s[i][1]-s[j][1])*(s[i][1]-s[j][1]));
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=(1<<n+1);j++){
			dp[j][i]=0x7f7f7f7f;
		}
	}
	for(int i=1;i<=n;i++) dp[1<<i-1][i]=a[0][i],q.push(1<<i-1),v[1<<i-1]=1;
	while(q.size()){
		for(int i=1;i<=n;i++){
			if(q.front()&(1<<i-1)){
				
//				cout<<fixed<<setprecision(2)<<q.front()<<" "<<i<<" "<<dp[q.front()][i]<<" ";
				
				for(int j=1;j<=n;j++){
					if(q.front()&(1<<j-1)) continue;
					dp[q.front()|(1<<j-1)][j]=min(dp[q.front()|(1<<j-1)][j],dp[q.front()][i]+a[i][j]);
					if(!v[q.front()|(1<<j-1)]) q.push(q.front()|(1<<j-1)),v[q.front()|(1<<j-1)]=1;
				}
			}
		}
		q.pop();
		
		
//		cout<<'\n';
		
		
	}
	ans=0x7f7f7f7f;
	for(int i=1;i<=n;i++) ans=min(ans,dp[(1<<n)-1][i]);
	cout<<fixed<<setprecision(2)<<ans;
}

DP

期望用倒序,概率用正序


线段树

常规
luogu P3372 线段树1

区间最值
luogu P2880

等差数列
luogu P1438

方差
luogu P1471

posted @ 2025-05-15 19:21  破碎中永恒  阅读(13)  评论(0)    收藏  举报