1565 方格取數(1)
題目:
給你一個n*n的格子的棋盤,每個格子裡面有一個非負數。從中取出若干個數,使得任意的兩個數所在的格子沒有公共邊,就是說所取的數所在的2個格子不能相鄰,並且取出的數的和最大。 Input包括多個測試例項,每個測試例項包括一個整數n 和n*n個非負數(n<=20) Output對於每個測試例項,輸出可能取得的最大的和 Sample Input
3 75 15 21 75 15 28 34 70 5Sample Output
188
狀態壓縮 動態規劃
程式碼:
#include<iostream>
using namespace std;
int n, num[20000], s = 1, maxx[20][20000], number[20];
void build(int k)
{
if (k >20)return;
for (int i = 0; num[i] < 1 << (k - 2); i++)num[++s] = num[i] + (1 << (k - 1));
build(k + 1);
}
int getsum(int j)
{
int sum = 0;
for (int i = 0; i < n; i++)sum += ((j&(1 << i))>0)*number[i];
return sum;
}
int main()
{
num[0] = 0, num[1] = 1;
build(2);
while (cin >> n)
{
if (n == 0)
{
cout << "0\n";
continue;
}
for (int i = 0; i < n; i++)for (int j = 0; num[j] < (1 << n); j++)maxx[i][j] = 0;
for (int i = 0; i < n; i++)cin >> number[i];
for (int j = 0; num[j] < (1 << n); j++)maxx[0][j] = getsum(num[j]);
for (int i = 1; i < n; i++)
{
for (int i = 0; i < n; i++)cin >> number[i];
for (int j = 0; num[j] < (1 << n); j++)for (int k = 0; num[k] < (1 << n); k++)
if ((num[j] & num[k]) == 0 && maxx[i][j] < maxx[i - 1][k] + getsum(num[j]))
maxx[i][j] = maxx[i - 1][k] + getsum(num[j]);
}
int ans = 0;
for (int j = 0; num[j] < (1 << n); j++)if (ans < maxx[n - 1][j])ans = maxx[n - 1][j];
cout << ans << endl;
}
return 0;
}
最坑爹的就是n=0的情況。。。
相關推薦
HDU 1565 - 方格取數(1) - [狀壓DP][網絡流 - 最大點權獨立集和最小點權覆蓋集]
printf 一個 cnblogs ret com bool limit .net amp 題目鏈接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory
HDU 1565 方格取數(1)
can getchar class target 方格取數 set ems n-k ++ 鏈接 思路 狀壓dp,dp[i][j]:表示到第i行,當前狀態為s的最大值。預處理在每一行選的時候可能的狀態,及這個狀態的價值。 轉移方程:dp[i][j] = max(
HDU 1565 方格取數(1) (狀壓DP)
http://acm.hdu.edu.cn/showproblem.php?pid=1565 #include <algorithm> #include <cstdio> #include <cstdlib> #include <cstring>
【HDU】1565方格取數(1)
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11226 Accepted Submission(
HDU 1565 方格取數(1)(最大點權獨立集)
題目大意:給你一個n*n的格子的棋盤,每個格子裡面有一個非負數。 從中取出若干個數,使得任意的兩個數所在的格子沒有公共邊,就是說所取的數所在的2個格子不能相鄰,並且取出的數的和最大。 解題思路:最大點權獨立集,關鍵是怎麼建圖了,我們可以採用染色的思想對這張圖
1565 方格取數(1)
題目: 給你一個n*n的格子的棋盤,每個格子裡面有一個非負數。 從中取出若干個數,使得任意的兩個數所在的格子沒有公共邊,就是說所取的數所在的2個格子不能相鄰,並且取出的數的和最大。 Input
HDU 1565 方格取數(1) (狀態壓縮DP入門題 2)(待更新)
Problem Description 給你一個n*n的格子的棋盤,每個格子裡面有一個非負數。從中取出若干個數,使得任意的兩個數所在的格子沒有公共邊,就是說所取的數所在的2個格子不能相鄰,並且取出的數的和最大。Input 包括多個測試例項,每個測試例項包括一個整數n 和n*n
HDU 1565 方格取數(1)(狀態壓縮DP)
挺簡單的一個狀壓DP,因為一點小失誤搞了好久。。 先按最大值跑一遍getState可以知道一行可以有多少種狀態,就是MAX_K。狀態轉移方程:dp[s][i] = max(dp[s][i], dp[j][i - 1] + getSum(state[s], i)),dp[s
HDU 1565 方格取數(1)(最大獨立點集)
題目地址 題意:中文。 思路:我是實在想不懂這類題目為什麼可以轉化為網路流來寫,於是我看了好多題解。然後發現因為相鄰的兩個點是不能同時選的,然後這樣就劃分成了兩類點,用奇偶建點的方法,可以很明白的寫出這個模型,因為相鄰兩點的橫縱座標加起來一定是一奇一偶的。然
hdu 1565 方格取數(1)【最大流】
程式碼: #include <iostream> #include <algorithm> #include <set> #include <map> #include <string.h> #i
hdu 1565 方格取數(1)(狀態壓縮DP)
終於可以寫題解了。因為一個細節上的失誤,讓我重新修改的程式碼一直通不過測試,鬱悶。 程式碼毫無參考價值,剛學的狀態壓縮DP,程式碼寫得很難看。 #include<stdio.h> #inc
hdu 1565 方格取數(1) 位壓縮動態規劃
hdoj 1565 dp 方格取數(1) Time Limit: 1000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1162
HDU 1565 方格取數(1)(插頭DP||狀態壓縮)
Problem Description 給你一個n*n的格子的棋盤,每個格子裡面有一個非負數。 從中取出若干個數,使得任意的兩個數所在的格子沒有公共邊,就是說所取的數所在的2個格子不能相鄰,並且取出的數的和最大。 Input 包括多個測試例項,每個測試例項包括一
hdu 1565 方格取數(1)(最小割)
方格取數(1) Problem Description 給你一個n*n的格子的棋盤,每個格子裡面有一個非負數。 從中取出若干個數,使得任意的兩個數所在的格子沒有公共邊,就是說所取的數所在的2個格子不能相鄰,並且取出的數的和最大。 Input 包括多個測試例項,每個測試例項
HDU 1565 方格取數(1) 狀態壓縮DP
題目大意: 從n*n的矩陣中取出一些數使得這些數互不相鄰,問最大和為多少 大致思路: 明顯的狀態壓縮DP,每兩行之間的狀態轉移,這裡受到記憶體限制只開兩個陣列來表示當先行和下一行來進行轉移,原本想用vector來記錄那兩個狀態之間可以轉換的,但是受到記憶體限制還是用時間換
hdu 1565 方格取數(1)【狀壓dp】
方格取數(1) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7585 Accepted Subm
hdu 1565 方格取數(2)(網絡流之最大點權獨立集)
href aps flow bit 明顯 log sum dir 一個 題目鏈接:hdu 1565 方格取數(2) 題意: 有一個n*m的方格,每個方格有一個數,現在讓你選一些數。使得和最大。 選的數不能有相鄰的。 題解: 我們知道對於普通二分圖來說,最大獨立點集 + 最小
hdu 1565 方格取數(狀壓dp)
給你一個n*n的格子的棋盤,每個格子裡面有一個非負數。 從中取出若干個數,使得任意的兩個數所在的格子沒有公共邊,就是說所取的數所在的2個格子不能相鄰,並且取出的數的和最大。 Input 包括多個測試例項,每個測試例項包括一個整數n 和n*n個非負數(n<=20)
HDU1565:方格取數(1) (狀態壓縮DP)
Problem Description 給你一個n*n的格子的棋盤,每個格子裡面有一個非負數。 從中取出若干個數,使得任意的兩個數所在的格子沒有公共邊,就是說所取的數所在的2個格子不能相鄰,並且取出的數的和最大。 Input 包括多個測試例項,每個測試例項包括一個整數n
hdu1565 方格取數(1)&&hdu1569 方格取數(2)(最小割)
題意:中文題不解釋。 思路:最大點權獨立集。注意二分匹配能處理的是最大點獨立集,帶權的就只能用最大流了。剛開始看是求取出的數和最大,那直接用最大流唄,不知道怎麼建邊。看別人的才知道這些帶權的都是獨立點,我們是無法對獨立點求最大流的。最大點權獨立集=點權總和-最小點權覆