題意: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 時...