bzoj4145: [AMPPZ2014]The Prices(狀態壓縮+Dp)
題目傳送門
。
解法:
怎麼我跟網上的題解都一樣只想到了n*3^m的演算法。
居然還可以這樣啊。
m<=16那麼可以狀壓為二進位制。
1表示選了0表示沒選
f[i][j]表示前i個商店選j狀態的最小花費。
首先所有f[i][j]=f[i-1][j]+d[i]。
因為他來到了這個商店。
然後對於每一個狀態j。
列舉他每個沒有1的位置 。然後狀態轉移就很容易啦。
當求完所有的狀態。這個商店也不一定一定要買東西。
那麼f[i][j]=min(f[i][j],f[i-1][j])
程式碼實現:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
int f[110][71000],n,m,c[110][21],d[110],bin[21];
int main() {
scanf("%d%d",&n,&m);
bin[0]=1;for(int i=1;i<=m;i++)bin[i]=bin[i-1]*2;
for(int i=1;i<=n;i++) {
scanf("%d",&d[i]);for(int j=0;j<m;j++)scanf("%d",&c[i][j]);
}memset(f,63,sizeof(f));f[0][0]=0;
for(int i=1;i<=n;i++) {
for(int j=0;j<bin[m];j++)f[i][j]=f[i-1][j]+d[i];
for(int j=0;j<bin[m];j++)for(int k=0;k<m;k++)if((j&bin[k])==0)
f[i][j^bin[k]]=min(f[i][j^bin[k]],f[i][j]+c[i][k]);
for(int j=0;j<bin[m];j++) f[i][j]=min(f[i][j],f[i-1][j]);
}printf("%d\n",f[n][bin[m]-1]);
return 0;
}
相關文章
- 簡易狀態壓縮DP
- HDU 5816 Hearthstone(狀態壓縮DP+概率)
- hdu--5418Victor and World+狀態壓縮DP
- 狀態壓縮
- 動態規劃——用二進位制表示集合的狀態壓縮DP動態規劃
- 狀壓DP
- 狀壓 dp
- [狀壓dp] 最短Hamilton路徑(模板題+狀壓dp)
- HDU 3006 The Number of set (狀態壓縮)
- 論文閱讀 狀態壓縮
- POJ3279 Fliptile【狀態壓縮+DFS】
- ACM-ICPC 2018 南京賽區網路預賽__E AC Challenge【狀態壓縮+DP】ACM
- 動態規劃中初識狀態壓縮(入門)動態規劃
- POJ 2777 Count Color (線段樹+狀態壓縮)
- 狀壓DP基礎入門
- HDU 1074 Doing Homework(狀壓DP)
- 合理安排(狀壓dp,包括技巧)
- E - Remove Pairs(狀壓dp+博弈論)REMAI
- NOI2001 炮兵陣地(狀壓dp)
- Luogu P1777 幫助 題解 [ 紫 ] [ 線性 dp ] [ 狀壓 dp ]
- 分組(狀壓dp+技巧:快速列舉子集)
- Nginx網路壓縮 CSS壓縮 圖片壓縮 JSON壓縮NginxCSSJSON
- Codeforces 11D A Simple Task 題解 [ 藍 ] [ 狀壓 dp ]
- 百練4124:海賊王之偉大航路(狀壓DP)
- 檔案壓縮和解壓縮
- Python實現壓縮和解壓縮Python
- JS壓縮方法及批量壓縮JS
- linux下壓縮解壓縮命令Linux
- linux壓縮和解壓縮命令整理Linux
- CF79D Password (差分+狀壓 dp+最短路/bfs)
- 一類哈密頓路徑/迴路為背景的狀壓dp
- CSP之壓縮編碼(動態規劃)動態規劃
- Linux tar分卷壓縮與解壓縮Linux
- CentOS 壓縮解壓CentOS
- Linux壓縮解壓Linux
- linux 高效壓縮工具之xz的壓縮解壓使用Linux
- Linux中檔案的壓縮和解壓縮Linux
- Gzipped 壓縮