Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

求助DP

Posted by shenmingxuan at 2023-02-11 11:44:11 on Problem 3311
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAX_INT = 2147483647;
const int INF = 0x3f3f3f3f;
const int MAXN = 200010;
int in(){
	int x = 0,f = 1;
	char c = getchar();
	while (!isdigit(c)){
		if (c == '-'){
			f = -1;
		}
		c = getchar();
	}
	while(isdigit(c)){
		x = x * 10 + c - '0';
		c = getchar();
	}
	return x * f;
}
int dis[12][12],dp[1<<11][12];
int n,ans;
signed main(){
	//freopen("xxx.in","r",stdin);
	//freopen("xxx.out","w",stdout);
	while(scanf("%d",n) && n){
		for(int i = 0;i <= n;i++){
			for(int j = 0;j <= n;j++){
				cin >> dis[i][j];
			}
		}
		for(int k = 0;k <= n;k++){
			for(int i = 0;i <= n;i++){
				for(int j = 0;j <= n;j++){
					if(dis[i][k]+dis[k][j] < dis[i][j]){
						dis[i][j] = dis[i][k]+dis[k][j];
					}
				}
			}
		}
		for(int s = 0;s <= (1<<n)-1;s++){
			for(int i = 0;i <= n;i++){
				if(s&(1<<(i-1))){
					if(s == (1<<(i-1))){
						dp[s][i] = dis[0][i];
					}
					else{
						dp[s][i] = INF;
						for(int j = 0;j <= n;j++){
							if(s & (1<<(j-1)) && j != i){
								dp[s][i] = min(dp[s][i],dp[s^(1<<(i-1))][j]+dis[j][i]);
							}
						}
					}
				}
			}
		}
		ans = dp[(1<<n)-1][1]+dis[1][0];
		for(int i = 2;i <= n;i++){
			if(dp[(1<<n)-1][i]+dis[i][0] < ans){
				ans = dp[(1<<n)-1][i]+dis[i][0];
			}
		}
		cout << ans << endl;
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator