1. 程式人生 > >hihocoder#1044狀態壓縮dp+滾動陣列

hihocoder#1044狀態壓縮dp+滾動陣列

//20ms  0
#include<iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
#define  MAXN 1500
int N,M,Q;
int dp[2][MAXN];//前一次的字母以及i的前面m個字母狀態
int num[2][MAXN];//記錄前m個字母中1的個數
int w[MAXN];

int main()
{
	scanf("%d %d %d",&N,&M,&Q);
	for (int i=0;i<N;++i)
	 scanf("%d",&w[i]);
	int ans = 0;
	memset(dp,-1,sizeof(dp));
	for (int s=(1<<M)-1;s>=0;s--)
	{
		int nt = 0;
		int sums = 0;
		for (int i=0;i<M;++i)
		{
			if (s&(1<<i))
			{
				nt++;
				sums+=w[i];
			}
		}
		if (nt<=Q&&sums>dp[0][s]){
		 dp[0][s] = sums;
		 num[0][s] = nt;
		}
	}
	//上一個M個數的狀態
	for (int i=M;i<N;++i)
	{
		for (int s=(1<<M)-1;s>=0;s--)
		{
			if (dp[0][s]>=0)
			{
				int cnt;
				if (s&(1<<0))//第一位是否選了
				 cnt = num[0][s]-1;
				else
				 cnt = num[0][s];
				int state = s>>1;//右移一位
				//若不選該位置
				dp[1][s>>1] =max(dp[1][s>>1],dp[0][s]); 
				if (cnt<Q)
				 dp[1][state|(1<<(M-1))] = max(dp[1][state|(1<<(M-1))],dp[0][s]+w[i]);
			}
		}
		memcpy(dp[0],dp[1],sizeof(dp[0]));
		memset(dp[1],-1,sizeof(dp[1]));
	}

	for (int s=(1<<M)-1;s>=0;s--)
	{
		if (dp[0][s]>ans)
		 ans = dp[0][s];
	}
	printf("%d\n",ans);
	return 0;
}

相關推薦

hihocoder#1044狀態壓縮dp+滾動陣列

//20ms 0#include<iostream> #include <string.h> #include <stdio.h> using namespace std; #define MAXN 1500 int N,M,Q; i

hihocoder-1048 狀態壓縮·二(狀壓DP

小Ho的觀察力一向不錯,這不,他很快便發現了M的取值範圍只可能為3、4、5三種情況,但是這一發現並沒有能夠給他減輕多少煩惱。 雖然在過去一段時間的訓練下,小Ho很快就意識到這道題目可能仍然是需要使用動態規劃進行解決,但是他苦思冥想也沒有能夠想到很好的狀態定義方式:“如果我每次列舉一塊蛋糕的放置位置,那麼我就

UVA 11825 - Hackers&#39; Crackdown 狀態壓縮 dp 枚舉子集

... 節點 ble hack 一個 tex wid cas 大小 UVA 11825 - Hackers‘ Crackdown 狀態壓縮 dp 枚舉子集 ACM 題目地址:11825 - Hackers‘ Crackdown 題意: 有一個由編號0~n-1的

UVa 11825 黑客的攻擊(狀態壓縮dp

狀態壓縮dp 題意 規劃 ace 部分 ons freopen ... 接下來 https://vjudge.net/problem/UVA-11825 題意: 假設你是一個黑客,侵入了一個有著n臺計算機(編號為0,1,...,n-1)的網絡。一共有n種服務,每臺計算機

POJ 2288 Islands And Bridges 狀態壓縮dp+哈密頓回路

pac -1 path max def %d 註意 sca can 題意:n個點 m條邊的圖,路徑價值定義為相鄰點乘積,若路路徑c[i-1]c[i]c[i+1]中c[i-1]-c[i+1]有邊 則價值加上三點乘積找到價值最大的哈密頓回路,和相應的方法數n<=13.暴力

2017盛大遊戲杯 零件組裝(狀態壓縮DP之巧妙枚舉子集)

mst print scan shu for ble pre 一個 clas 題目鏈接:2017盛大遊戲杯 零件組裝 題意: 有n個零件,給你相鄰關系和排斥關系,每兩塊零件組裝起來有一個代價,問最少的代價總和是多少。 題解: 考慮狀態壓縮,dp[i]表示i這個集合為一個零件

HDU 1074 Doing Homework 狀態壓縮DP

output -- max 方式 sch adl struct work small 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 題目大意:小明打完比賽回來補作業,N個作業每個作業有 名字,截止日期,完成所需時間

Light OJ 1406 Assassin`s Creed 狀態壓縮DP+強連通縮點+最小路徑覆蓋

ret top sizeof set tor pop sni spa sin 題目來源:Light OJ 1406 Assassin`s Creed 題意:有向圖 派出最少的人經過全部的城市 而且每一個人不能走別人走過的地方 思路:最少的的人能夠走全然圖 明顯是

HDU 3001(狀態壓縮DP

狀態壓縮 printf pri names urn 壓縮 puts -1 路徑 題意:遍歷所有的城市的最短路徑,每個城市最多去兩遍。將城市的狀態用3進制表示。 狀態轉移方程為 dp[NewS][i]=min( dp[NewS][i],dp[S][j]+dis[i][j])

POJ 2411(狀態壓縮DP

open long true poj 如果 [0 pri 檢查 out 題意:一個矩陣,只能放1*2的木塊,問將這個矩陣完全覆蓋的不同放法有多少種。 如果是橫著的就定義11,如果豎著的定義為豎著的01,這樣按行dp只需要考慮兩件事兒,當前行&上一行,是不是全為1,不

hihoCoder 1048 : 狀態壓縮·二

.com int ron 可能 遊戲 自然 span oid blog 題目鏈接:http://hihocoder.com/problemset/problem/1048 題目大意:用1*2或者2*1的方塊鋪滿一個N*M的大方格,共有多少種方法。結果對1e9+7取余。2&l

HDU 2825 Wireless Password ( Trie圖 && 狀態壓縮DP )

inline ble 轉移 top hdu max style 全部 新節點 題意 : 輸入n、m、k意思就是給你 m 個模式串,問你構建長度為 n 至少包含 k 個模式串的方案有多少種 分析 : ( 以下題解大多都是在和 POJ 2778 && POJ

hdu 4856 Tunnels 狀態壓縮dp

con 通道 panel follow span scan urn left cit Tunnels Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

狀態壓縮dp第一題

tro 兩種 關系 edge sin i+1 第一題 describe 壓縮

狀態壓縮·一(狀態壓縮DP

pos weight i+1 else urn footer 分享 pre 同時 描述 小Hi和小Ho在兌換到了喜歡的獎品之後,便繼續起了他們的美國之行,思來想去,他們決定乘坐火車前往下一座城市——那座城市即將舉行美食節! 但是不幸的是,小Hi和小Ho並沒有能夠買到很好的火

poj3254二進制放牛——狀態壓縮DP

true 上界 pos csharp targe pac 狀態 二進制 arp 題目:http://poj.org/problem?id=3254 利用二進制壓縮狀態,每一個整數代表一行的01情況; 註意預處理出二進制表示下沒有兩個1相鄰的數的方法,我的方法(不知為何)錯了

POJ--3311--Hie with the Pie(暴力枚舉+floyd)/(狀態壓縮DP+floyd)

簡介 提前 比較 -h 最短 客戶 狀態 blog log 簡介 狀態壓縮入門,先說用暴力枚舉的方法做的,再說狀態壓縮DP,對於剛開始學習狀態壓縮的同學,兩者相互比較學習,可以明顯看出兩者區別,有利於對狀態壓縮DP的理解,提前說下,兩者耗時是 157Ms和 0Ms 。 題意

HDOJ--3001--Travelling(狀態壓縮DP+bfs)

介紹 string memset con 代碼 bsp size lin 需要 介紹這道題和3311差不多,只需將二進制換為三進制就好,但對於在做3311時用的是自頂向下方法做的話,上一題的模板都不能套了,還得換個思路。 題意 N個城市,M條路(有重邊,無向圖),x->

HDOJ--3681--Prison Break(BFS預處理+狀態壓縮DP

-s cin pos hdoj con 多少 電源 too 最大的 題意 F--起點 S--空格 G--能量池,只能充一次電,充完之後G變為S,也可已選擇不充而當成普通的S D--激光區,不能走 Y--電源開關 M被關在一所監獄之中,F為起點,每走一步(上下左右)消耗1節能

Codeforces 580D Kefa and Dishes(狀態壓縮DP)

直接 a+b code 組成 star using ios AI ret 題目鏈接:http://codeforces.com/problemset/problem/580/D 題目大意:有n盤菜每個菜都有一個滿意度,k個規則,每個規則由x y c組成,表示如果再y之前吃