1. 程式人生 > >HDU 1565 方格取數(1) (狀態壓縮DP入門題 2)(待更新)

HDU 1565 方格取數(1) (狀態壓縮DP入門題 2)(待更新)

Problem Description 給你一個n*n的格子的棋盤,每個格子裡面有一個非負數。
從中取出若干個數,使得任意的兩個數所在的格子沒有公共邊,就是說所取的數所在的2個格子不能相鄰,並且取出的數的和最大。Input 包括多個測試例項,每個測試例項包括一個整數n 和n*n個非負數(n<=20)Output 對於每個測試例項,輸出可能取得的最大的和Sample Input375 15 21 75 15 28 34 70 5 Sample Output188

解題思路:這題和第一道狀態壓縮題很像,都滿足我總結的那句話。在這道題裡,你需要滿足的是相鄰的沒有棋子,所以你先求出全部滿足的狀態,然後再求一個合理狀態下的最大值存起來。 最後在這些合理狀態中尋找一個最大值,這個就是答案。

這題還可以用網路流來寫,打算下星期後鞏固網路流再寫。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
int num[25][25],prime[maxn],dp[25][maxn],tot,n;
int main(){
	int i,j,k;
	while(scanf("%d",&n)!=EOF){
		memset(dp,0,sizeof(dp));
		memset(prime,0,sizeof(prime));
		tot=0;
		for(i=0;i<n;i++){
			for(j=0;j<n;j++){
				scanf("%d",&num[i][j]);
			}
		}
		int end=1<<n;
		for(i=0;i<end;i++){
			if((i&(i<<1))==0) prime[tot++]=i;
		}
		for(i=0;i<n;i++){
			for(j=0;j<tot;j++){
				int sum=0;
				for(k=0;k<n;k++){
					if((1<<k)&prime[j])
						sum+=num[i][k];
				}
				dp[i][j]=sum;
				if(i==0) continue;
				for(k=0;k<tot;k++){
					if((prime[j]&prime[k])==0){
						dp[i][j]=max(dp[i][j],dp[i-1][k]+sum);
					}
				}
			}
		}
		int ans=0;
		for(i=0;i<tot;i++){
			ans=max(ans,dp[n-1][i]);
		}
		printf("%d\n",ans);
	}
	return 0;
}

待更!!!

特殊情況:

4

10 0 0 0

0 0 0 0

0 0 0 0

10 0 0 0

答案是20

相關推薦

HDU 1565 方格(1) 狀態壓縮DP入門 2更新

Problem Description 給你一個n*n的格子的棋盤,每個格子裡面有一個非負數。從中取出若干個數,使得任意的兩個數所在的格子沒有公共邊,就是說所取的數所在的2個格子不能相鄰,並且取出的數的和最大。Input 包括多個測試例項,每個測試例項包括一個整數n 和n*n

hdu 1565 方格(1)狀態壓縮DP

終於可以寫題解了。因為一個細節上的失誤,讓我重新修改的程式碼一直通不過測試,鬱悶。 程式碼毫無參考價值,剛學的狀態壓縮DP,程式碼寫得很難看。 #include<stdio.h> #inc

HDU 1565 方格(1)插頭DP||狀態壓縮

Problem Description 給你一個n*n的格子的棋盤,每個格子裡面有一個非負數。 從中取出若干個數,使得任意的兩個數所在的格子沒有公共邊,就是說所取的數所在的2個格子不能相鄰,並且取出的數的和最大。 Input 包括多個測試例項,每個測試例項包括一

HDU 1565 方格(1) 狀壓DP

http://acm.hdu.edu.cn/showproblem.php?pid=1565 #include <algorithm> #include <cstdio> #include <cstdlib> #include <cstring>

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)最小割

方格取數(1) Problem Description 給你一個n*n的格子的棋盤,每個格子裡面有一個非負數。 從中取出若干個數,使得任意的兩個數所在的格子沒有公共邊,就是說所取的數所在的2個格子不能相鄰,並且取出的數的和最大。 Input 包括多個測試例項,每個測試例項

HDU 1565 方格(1) 狀態壓縮DP

題目大意: 從n*n的矩陣中取出一些數使得這些數互不相鄰,問最大和為多少 大致思路: 明顯的狀態壓縮DP,每兩行之間的狀態轉移,這裡受到記憶體限制只開兩個陣列來表示當先行和下一行來進行轉移,原本想用vector來記錄那兩個狀態之間可以轉換的,但是受到記憶體限制還是用時間換

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)(最大點權獨立集)

題目大意:給你一個n*n的格子的棋盤,每個格子裡面有一個非負數。 從中取出若干個數,使得任意的兩個數所在的格子沒有公共邊,就是說所取的數所在的2個格子不能相鄰,並且取出的數的和最大。 解題思路:最大點權獨立集,關鍵是怎麼建圖了,我們可以採用染色的思想對這張圖

hdu 1565 方格(1)【最大流】

程式碼: #include <iostream> #include <algorithm> #include <set> #include <map> #include <string.h> #i

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

方格取數(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7585    Accepted Subm

hdu 1565 方格狀壓dp

給你一個n*n的格子的棋盤,每個格子裡面有一個非負數。  從中取出若干個數,使得任意的兩個數所在的格子沒有公共邊,就是說所取的數所在的2個格子不能相鄰,並且取出的數的和最大。 Input 包括多個測試例項,每個測試例項包括一個整數n 和n*n個非負數(n<=20)

HDU1565方格(1)

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11226    Accepted Submission(

hdu 1565 方格(2)(網絡流之最大點權獨立集)

href aps flow bit 明顯 log sum dir 一個 題目鏈接:hdu 1565 方格取數(2) 題意: 有一個n*m的方格,每個方格有一個數,現在讓你選一些數。使得和最大。 選的數不能有相鄰的。 題解: 我們知道對於普通二分圖來說,最大獨立點集 + 最小

1565 方格(1)

題目: 給你一個n*n的格子的棋盤,每個格子裡面有一個非負數。  從中取出若干個數,使得任意的兩個數所在的格子沒有公共邊,就是說所取的數所在的2個格子不能相鄰,並且取出的數的和最大。 Input

HDU 1565 方格 題解

【題目】: Problem Description 給你一個n*n的格子的棋盤,每個格子裡面有一個非負數。 從中取出若干個數,使得任意的兩個數所在的格子沒有公共邊,就是說所取的數所在的2個格子不能相鄰,並且取出的數的和最大。 Input 包括多個測試例項,每個測

hdu 2167 方格 【狀壓dp經典

取出 fff ack 分析 題目 經典 gets bsp ets <題目鏈接> 題目大意: 給出一些數字組成的n*n階矩陣,這些數字都在[10,99]內,並且這個矩陣的 3<=n<=15,從這個矩陣中隨機取出一些數字,在取完某個數字後,該數字周圍8