P1171 售货员的难题 暴力dp

题面



著名的TSP问题,NPC问题
对于数据大的情况,我们可以使用一系列近似算法进行寻找解。
对于数据规模小的情况,我们可以直接暴力dp
一开始写了一个dfs,然后就被n=20的数据卡爆了

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using std::min;
const int maxn=22;
int f[1<<maxn][maxn];
int M[maxn][maxn];
int n;
int dfs(int base,int now)
{
    if(base&1==0)   return f[base][now]=0x7fffffff;
    if(f[base][now])    return f[base][now];
    int ans=0x7ffffff;
    for(int i=0;i<n;i++)
        if(base&(1<<i)&&i+1!=now)
            ans=min(ans,dfs(base^(1<<(now-1)),i+1)+M[i+1][now]);
    return f[base][now]=ans;
}
int main()
{
    scanf("%d",&n);
    f[1][1]=1;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            scanf("%d",&M[i][j]);
            if(i==j)    M[i][j]=0x7ffffff;
        }
    for(int i=1;i<=n;i++)
    {
        M[i][n+1]=M[i][1];
        M[n+1][i]=M[1][i];
    }
    n++;
    dfs((1<<n)-1,n);
    printf("%d",f[(1<<n)-1][n]-1);
}

然后就回去补了一发递推,还是递推常数小呀。

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using std::min;
const int maxn=20,inf=0x7ffffff;
int f[1<<maxn][maxn];
int M[maxn][maxn];
int n;
int main()
{
    memset(f,127,sizeof(f));
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            scanf("%d",&M[i][j]);
    for(int i=0;i<n;i++)   M[i][i]=inf;
    f[1][0]=0;
    for(int i=1;i<(1<<n);i++)
        for(int j=0;j<n;j++)
            if(i&(1<<j))
                for(int k=0;k<n;k++)
                    if((i&(1<<k))==0)
                        f[i^(1<<k)][k]=min(f[i^(1<<k)][k],f[i][j]+M[j][k]);
    int ans=inf;
    for(int i=1;i<n;i++)
        ans=min(ans,f[(1<<n)-1][i]+M[i][0]);
    printf("%d",ans);
}

感觉dp在noip会是我的大难♂题

原文地址:https://www.cnblogs.com/Lance1ot/p/9773574.html

时间: 2024-10-06 07:16:29

P1171 售货员的难题 暴力dp的相关文章

P1171 售货员的难题 - 状压DP【最短Hamilton路径】

P1171 售货员的难题 Sol: 最短Hamilton路径,经典的NPC问题,小数据可以通过状压DP 实现. 状态:\(f[i][j]\)表示当前在第i号点,且已经过的点的状态为j 时的最短Hamilton路径. 阶段:若以点为阶段,由于会从点i转移到点i+1,还可能从i+1转移到i-1,不具有无后效性,因此我们考虑以二进制状态为阶段进行转移. 决策:考虑由哪一个点转移而来. 转移:\(f[i][j]=\max \limits_{i\&(1<<i)\&\&i\&

P1171 售货员的难题 喻队状压 DP

题目描述 某乡有n个村庄(1<n<20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1,他不知道选择什么样的路线才能使所走的路程最短.请你帮他选择一条最短的路. 输入输出格式 输入格式: 村庄数n和各村之间的路程(均是整数). 输出格式: 最短的路程. 输入输出样例 输入样例#1: 3 0 2 1 1 0 2 2 1 0

P1171 售货员的难题--搜索(剪枝)

题目背景 数据有更改 题目描述 某乡有nn个村庄(1<n \le 201<n≤20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)s(0<s<1000)是已知的,且AA村到BB村与BB村到AA村的路大多不同.为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为11,他不知道选择什么样的路线才能使所走的路程最短.请你帮他选择一条最短的路. 输入输出格式 输入格式: 村庄数nn和各村之间的路程(均是整数). 输出

【题解】P1171 售货员的难题

Tags 搜索,状压?. 裸的旅行商问题 #include <stdio.h> #include <string.h> #define re register #define GC getchar() #define Clean(X,K) memset(X,K,sizeof(X)) #define U unsigned #define Min(X,Y) (X<Y?X:Y) short Qread () { short X = 0 ; char C = GC ; while (

codevs2596 售货员的难题(状压dp)

2596 售货员的难题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 钻石 Diamond 题目描述 Description 某乡有n个村庄(1<n<=15),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1,他不知道选择什么样的路线才能使所走的路程最短.请你帮他选择一条最短的路. 输入描述 Input D

状压DP [SWUST OJ 411] 售货员的难题

售货员的难题(0411) Time limit(ms): 5000 Memory limit(kb): 65535 Submission: 1744 Accepted: 200 Description 某乡有n个村庄(1< n < 20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0 < s < 1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为 1,他不知道选择什么样的路线才

2596 售货员的难题 水深搜

2596 售货员的难题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 钻石 Diamond 题目描述 Description 某乡有n个村庄(1<n<=15),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1,他不知道选择什么样的路线才能使所走的路程最短.请你帮他选择一条最短的路. 输入描述 Input D

2596 售货员的难题

2596 售货员的难题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 某乡有n个村庄(1<n<=15),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1,他不知道选择什么样的路线才能使所走的路程最短.请你帮他选择一条最短的路. 输入描述 Inpu

暴力/DP Codeforces Beta Round #22 (Div. 2 Only) B. Bargaining Table

题目传送门 1 /* 2 题意:求最大矩形(全0)的面积 3 暴力/dp:每对一个0查看它左下的最大矩形面积,更新ans 4 注意:是字符串,没用空格,好事多磨,WA了多少次才发现:( 5 详细解释:http://www.cnblogs.com/cszlg/p/3217478.html 6 */ 7 #include <cstdio> 8 #include <algorithm> 9 #include <cstring> 10 #include <cmath>