社区讨论
这题为什么不能用记忆化,会WA
P1850[NOIP 2016 提高组] 换教室参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @m1gbt6nz
- 此快照首次捕获于
- 2024/09/24 19:01 去年
- 此快照最后确认于
- 2025/11/04 18:57 4 个月前
可以获得 分。
代码以下:
CPP#include <bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
const int N=2005,M=305,INF=0x3f3f3f3f3f3f3f3f;
int g[M][M],c[N][3];
int dis[M][M];
double pc[N],f[N][2][N];
int n,m,v,e;
double dfs(int cl,int now,int sum) {
if(sum>m) return 1e20;
if(cl>n) return 0;
if(f[cl][now][sum]!=1e20) return f[cl][now][sum];
f[cl][now][sum]=dfs(cl+1,1,sum)+dis[c[cl-1][now]][c[cl][1]];
f[cl][now][sum]=min(f[cl][now][sum],
pc[cl]*(dfs(cl+1,2,sum+1)+dis[c[cl-1][now]][c[cl][2]])+
(1.0-pc[cl])*(dfs(cl+1,1,sum+1)+dis[c[cl-1][now]][c[cl][1]]));
//cout<<cl<<' '<<now<<' '<<sum<<' '<<f[cl][now][sum]<<endl;
return f[cl][now][sum];
}
signed main() {
// freopen("classroom.in","r",stdin);
// freopen("classroom.out","w",stdout);
cin>>n>>m>>v>>e;
for(int i=1;i<=v;i++)
for(int j=1;j<=v;j++)
if(i==j) dis[i][j]=0;
else dis[i][j]=INF;
for(int i=1;i<=n;i++) cin>>c[i][1];
for(int i=1;i<=n;i++) cin>>c[i][2];
for(int i=1;i<=n;i++) cin>>pc[i];
for(int i=1;i<=e;i++) {
int x,y,z;scanf("%lld%lld%lld",&x,&y,&z);
dis[x][y]=min(dis[x][y],z);dis[y][x]=min(dis[y][x],z);
}
for(int k=1;k<=v;k++)
for(int i=1;i<=v;i++)
for(int j=1;j<=v;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
for(int i=0;i<=n;i++) for(int j=0;j<=m;j++) f[i][1][j]=f[i][2][j]=1e20;
printf("%.2llf",dfs(1,1,0));
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...