POJ 2288 狀壓dp Hamilton迴路

2022-05-29 18:15:15 字數 1498 閱讀 6784

題意:hamilton迴路的權值為:

1、經過的每條邊的兩個點的點權和

2、連續經過兩點的乘積

3、如果三條邊形成三角形則再加上三個點權的乘積

求最大值+路徑條數

思路:10來個點用乙個小的鄰接矩陣就可以判斷是否相連,判斷三角形就可以在dp加一維記錄前兩個點的資訊,列舉的時候多列舉到前2個點

即dp[state][pre][now],表示當前為state、前乙個點pre、當前點now的最大權值,路徑條數跟最短路條數的記錄方法一樣

錯的地方:沒判斷dp[state][pre][now] == -1就wa了,加上就a了,我之前明明都加上了i & (1<

**:

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7

#define ll long long

8#define inf 0x3f3f3f3f

9#define debug(x) cout << #x << " = " << x << endl

10using

namespace

std;

1112 ll dp[1

<<13][14][14], num[1

<<13][14][14

];13 ll a[14

];14

bool d[14][14

];15

16int

main()

29if (n == 1

)33 memset(dp, -1, sizeof

dp);

34 memset(num, 0, sizeof

num);

35for (int i = 0; i < n; i++)42}

43//

dp[state][pre][now]

44for (int i = 3; i < (1

<)

61else

if (tmp ==dp[nxt][k][r])

62 num[nxt][k][r] +=num[i][j][k];63}

64}65}

66}67 ll ans = -1, sum = 0;68

for (int i = 0; i < n; i++)

76else

if (ans == dp[(1

<1

][i][j])

77 sum += num[(1

<1

][i][j];78}

79}80if (ans == -1) printf("

0 0\n");

81else printf("

%lld %lld\n

", ans, sum/2

);82}83

return0;

84 }

POJ 2288(狀態壓縮經典(巨坑)例題)

寫了一天,還是wa,後來看了大佬的題解,貼一下鏈結 include include include poj不能用 include using namespace std const int maxn 14 typedef long long ll int v maxn 點權值 ll dp 1 max...

POJ 3279(狀壓暴力)

poj 3279 不會做。但是感覺思路挺有意思的 大體的思路是 把第一行狀態確定好了,之後的每一行都由前一行決定,也就是之後的所有狀態都確定好了,此時列舉第一行的狀態,看看根據該情況最後一行是否能符合情況,難點就是狀態的壓縮,也是比較基礎的地方了,主要還是難想,對就是菜。include includ...

題解 poj3254 狀壓DP

題目鏈結 思路摘抄自大佬部落格 狀態可由二進位制表示,只需將每種狀態轉化為相應的十進位制數,即可只用乙個數字,就能表示某一種狀態 以dp i state j 來表示對於前i行,第i行採用第j種狀態時可以得到的可行方案總數!例如 回頭看樣例資料,dp 2 1 即代表第二行使用第2中狀態 0 1 0 時...