社区讨论

这题为什么不能用记忆化,会WA

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

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@m1gbt6nz
此快照首次捕获于
2024/09/24 19:01
去年
此快照最后确认于
2025/11/04 18:57
4 个月前
查看原帖
可以获得 8888 分。
代码以下:
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 条回复,欢迎继续交流。

正在加载回复...