社区讨论

垃圾dp毁我时间复杂度

P1850[NOIP 2016 提高组] 换教室参与者 7已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@lo9lj88a
此快照首次捕获于
2023/10/28 13:23
2 年前
此快照最后确认于
2023/10/28 13:23
2 年前
查看原帖
CPP
#include<iostream>
#include<cstring>
using namespace std;
int n,m,v,e,dis[2010][2010],c[2010],d[2010];
void floyd(){
	for(register int i=1;i<=v;i++)
		for(register int j=1;j<=v;j++)
			for(register int k=1;k<=v;k++)
			dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
inline int read(){
	int x=1,y=0;
	char ch=getchar();
	while(ch>'9'||ch<'0'){
		if(ch=='-') x=-1;
		ch=getchar();
	}
	while(ch>='0'&& ch<='9'){
		y=y*10+ch-'0';
		ch=getchar();
	}
	return x*y;
}
double k[2010],dp[2010][2010][2],ans=0x7f7f7f7f;
int main(){
	n=read(),m=read(),v=read(),e=read();
	memset(dis,127/3,sizeof(dis));
	for(register int i=1;i<=n;i++) c[i]=read();
	for(register int i=1;i<=n;i++) d[i]=read();
	for(register int i=1;i<=n;i++) scanf("%lf",&k[i]);
	for(register int i=1;i<=e;i++){
		int u=read(),v=read(),w=read();
		dis[u][v]=dis[v][u]=min(dis[u][v],w);
	}
	for(register int i=1;i<=v;i++) dis[i][i]=0;
	floyd();
	for(register int i=1;i<=n;i++) 
		for(register int j=0;j<=m;j++) dp[i][j][0]=dp[i][j][1]=0x7f7f7f7f;
	dp[1][0][0]=dp[1][1][1]=0;
	for(register int i=2;i<=n;i++)
		for(register int j=0;j<=min(i,m);j++){
			dp[i][j][0]=min(dp[i-1][j][0]+dis[c[i-1]][c[i]],dp[i-1][j][1]+k[i-1]*dis[d[i-1]][c[i]]+(1-k[i-1])*dis[c[i-1]][c[i]]);
			if(j!=0)
				dp[i][j][1]=min(dp[i-1][j-1][0]+k[i]*dis[c[i-1]][d[i]]+(1-k[i])*dis[c[i-1]][c[i]],dp[i-1][j-1][1]+k[i-1]*k[i]*dis[d[i-1]][d[i]]+k[i-1]*(1-k[i])*dis[d[i-1]][c[i]]+(1-k[i-1])*k[i]*dis[c[i-1]][d[i]]+(1-k[i-1])*(1-k[i])*dis[c[i-1]][c[i]]);
		}
	for(register int i=0;i<=m;i++) ans=min(ans,min(dp[n][i][0],dp[n][i][1]));
	printf("%.2lf",ans);
	return 0;
}
弗洛伊德叠了三重循环,主函数还有一堆
我已经不知道怎么优化了

回复

9 条回复,欢迎继续交流。

正在加载回复...