国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

算法提高 金陵十三釵 狀壓DP

2019-11-06 06:35:37
字體:
供稿:網(wǎng)友

        思路:深度搜索復雜度N!過不了。考慮動態(tài)規(guī)劃:將已經(jīng)選擇的列記為1,未選擇表示0,二進制壓縮,例如110,就表示選擇了第1列和第2列。

     d(i, t)表示當前已經(jīng)匹配了i行,選擇了t這些列。狀態(tài)轉(zhuǎn)移:

for(int i = 0; i < n; ++i) {		int x = 1 << i;		if(x & val) d = max(d, like[row][i] + dfs(row+1, val - x, k-1));	}

此時總的狀態(tài)數(shù)就是1<<n,相比N!是極大的優(yōu)化,減少了很多重復情況的搜索。

用記憶化搜索,代碼很好寫。

#include <cstdio>#include <cmath>#include <algorithm>#include <cstring>#include <utility>#include <string>#include <iostream>#include <map>#include <set>#include <vector>#include <queue>#include <stack>using namespace std;#PRagma comment(linker, "/STACK:1024000000,1024000000") #define eps 1e-10#define inf 0x3f3f3f3f#define PI pair<int, int> typedef long long LL;const int maxn = 13 + 5;int like[maxn][maxn], dp[maxn][1<<13];int n, ans;int dfs(int row, int val, int k) { //row表示行,k表示當前選擇了多少列 	if(dp[row][val] != -1) return dp[row][val];	int &d = dp[row][val];	if(k == 1) { //邊界 		for(int i = 0; i < n; ++i) {			int x = 1 << i;			if(x & val) return d = like[row][i];		}	}	for(int i = 0; i < n; ++i) {		int x = 1 << i;		if(x & val) d = max(d, like[row][i] + dfs(row+1, val - x, k-1));	}	return d;}int main() {	while(scanf("%d", &n) == 1) {		for(int i = 0; i < n; ++i) 			for(int j = 0; j < n; ++j) {				scanf("%d", &like[i][j]);			}		memset(dp, -1, sizeof(dp));		int start = (1<<n)-1;		printf("%d/n", dfs(0, start, n));	}	return 0;}如有不當之處歡迎指出!


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 泗阳县| 无极县| 二连浩特市| 宽甸| 邯郸市| 宁南县| 湾仔区| 顺平县| 南安市| 黎平县| 江西省| 汝州市| 万宁市| 泌阳县| 濮阳县| 滨州市| 桓台县| 师宗县| 临颍县| 平舆县| 南陵县| 六盘水市| 清丰县| 当阳市| 恩平市| 罗山县| 涪陵区| 常宁市| 星子县| 朝阳市| 囊谦县| 丰镇市| 平邑县| 左云县| 沙坪坝区| 拉孜县| 海林市| 岐山县| 宕昌县| 保康县| 彭山县|