TSP+期望——lightoj1287记忆化搜索,好题!

感觉是很经典的题

记忆化时因为不好直接通过E判断某个状态是否已经求过,所以再加一个vis打标记即可

/*E[S][u]表示从u出发当前状态是S的期望*/
#include<bits/stdc++.h>
using namespace std;
#define N 16
#define INF 0x3f3f3f3f

int mp[N][N],n,m;
double E[N][1<<N];
bool vis[N][1<<N];

bool dfs(int S,int root){//在状态S下,从root点出发
    if(S==(1<<n)-1){E[root][S]=0;return 1;}
    if(vis[root][S])return E[root][S]>0;//这个点这个状态已经被访问过
    vis[root][S]=1;
    E[root][S]=5;

    int cnt=0,step;
    for(int i=0;i<n;i++){
        if(!(S&(1<<i)) && mp[root][i]!=INF && dfs(S|(1<<i),i)){//状态集合里没有i,有边,且该边符合条件
            step=S|(1<<i);
            cnt++;
            E[root][S]+=mp[root][i]+E[i][step];
        }
    }

    if(!cnt){E[root][S]=0;return 0;}
    E[root][S]/=cnt;
    return true;
}

int main(){
    int T;cin>>T;
    for(int tt=1;tt<=T;tt++){
        memset(mp,0x3f,sizeof mp);
        memset(vis,0,sizeof vis);

        int u,v,w;
        cin>>n>>m;
        for(int i=1;i<=m;i++){
            cin>>u>>v>>w;
            mp[u][v]=mp[v][u]=w;
        }
        dfs(1,0);
        printf("Case %d: %.10lf\n",tt,E[0][1]);
    }
}

原文地址:https://www.cnblogs.com/zsben991126/p/10847923.html

时间: 2024-10-12 21:39:26

TSP+期望——lightoj1287记忆化搜索,好题!的相关文章

BZOJ 1415 NOI2005 聪聪和可可 期望DP+记忆化搜索 BZOJ200题达成&amp;&amp;NOI2005全AC达成

题目大意:给定一个无向图,聪聪在起点,可可在终点,每个时刻聪聪会沿最短路走向可可两步(如果有多条最短路走编号最小的点),然后可可会等概率向周围走或不动,求平均多少个时刻后聪聪和可可相遇 今天早上起床发现194了然后就各种刷--当我发现199的时候我决定把第200题交给05年NOI仅剩的一道题--结果尼玛调了能有一个小时--我居然没看到编号最小这个限制0.0 首先我们知道,由于聪聪走两步而可可走一步,所以聪聪一定能在有限的时刻追上可可,而且两人的距离随着时间进行单调递减 于是我们记忆化搜索 首先用

HDU 1142 A Walk Through the Forest (Dijkstra + 记忆化搜索 好题)

A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6350    Accepted Submission(s): 2332 Problem Description Jimmy experiences a lot of stress at work these days, especial

[期望dp+记忆化搜索] light oj 1038 Race to 1 Again

题意: 给一个数n,每次随机选它的一个约数去除n,直到除到1为止,问除的次数的期望. 思路: E[n]= E[n/a[1]]/cnt+E[n/a[2]]/cnt+...+E[n/a[n]]/cnt+1 a[i]为n的约数,cnt为约数的个数. 显然a[i]=1  则(1-1/cnt)E[n]=E[n/a[2]]/cnt+...+E[n/a[n]]/cnt+1 记忆化搜索就ok了~ 代码: #include"cstdlib" #include"cstdio" #inc

POJ 3249 Test for Job (记忆化搜索 好题)

Test for Job Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 9512   Accepted: 2178 Description Mr.Dog was fired by his company. In order to support his family, he must find a new job as soon as possible. Nowadays, It's hard to have a job

【bzoj4428】[Nwerc2015]Debugging调试 数论+记忆化搜索

题目描述 一个 $n$ 行的代码出了bug,每行都可能会产生这个bug.你要通过输出调试,在其中加入printf来判断bug出现的位置.运行一次程序的时间为 $r$ ,加入一条printf的时间为 $p$ ,求最坏情况下调出程序的最短时间. 输入 输入包括一行三个整数: n(1≤n≤10^6),代码行的数目; r(1≤r≤10^9),编译和运行程序直到它崩溃的时间量; p(1≤p≤10^9),增加单个的printf行所花费的时间. 输出 输出的最坏情况使用最优策略找到崩溃行的时间. 样例输入 1

【题解】滑雪 luogu1434 记忆化搜索

记忆化搜索入门题 题目 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长的滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子: 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小. 在上面的例

POJ 1579 Function Run Fun 【记忆化搜索入门】

题目传送门:http://poj.org/problem?id=1579 Function Run Fun Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20560   Accepted: 10325 Description We all love recursion! Don't we? Consider a three-parameter recursive function w(a, b, c): if a <=

P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 记忆化搜索dfs

题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵循的穿越路线来确保奶牛的乐趣.为了实现这个让奶牛在牛棚里来回穿梭的方案,FJ在第i号隔间上张贴了一个“下一个隔间”Next_i(1<=Next_i<=N),告诉奶牛要去的下一个隔间:这样,为了收集它们的糖果,奶牛就会在牛棚里来回穿梭了. FJ命令奶牛i应该从i号隔间开始收集糖果.如果一只奶牛回到某

[SHOI2002]滑雪 (记忆化搜索模版)

题目链接:https://www.luogu.com.cn/problem/P1434 想法: 记忆化搜索板子题: #include <algorithm> #include <string> #include <string.h> #include <vector> #include <map> #include <stack> #include <set> #include <queue> #include