日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 4739 状压DP

發布時間:2025/3/21 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 4739 状压DP 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這里有狀態壓縮DP的好博文

題目:題目比較神,自己看題目吧

分析:

大概有兩種思路:

1.dfs,判斷正方形的話可以通過枚舉對角線,大概每次減少4個三角形,加上一些小剪枝的話可以過。

2.狀壓DP,先預處理出所有可以組成正方形的方案,根據題目的數據范圍計算不會超過100個正方形方案。n個正方形用二進制的方式記錄,每一位記錄是否有沒有引爆,則狀態轉移比較明顯了。

?

#include <set> #include <map> #include <list> #include <cmath> #include <queue> #include <stack> #include <string> #include <vector> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm>using namespace std;typedef long long ll; typedef unsigned long long ull;#define debug puts("here") #define rep(i,n) for(int i=0;i<n;i++) #define rep1(i,n) for(int i=1;i<=n;i++) #define REP(i,a,b) for(int i=a;i<=b;i++) #define foreach(i,vec) for(unsigned i=0;i<vec.size();i++) #define pb push_back #define RD(n) scanf("%d",&n) #define RD2(x,y) scanf("%d%d",&x,&y) #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z) #define RD4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w) #define All(vec) vec.begin(),vec.end() #define MP make_pair #define PII pair<int,int> #define PQ priority_queue #define cmax(x,y) x = max(x,y) #define cmin(x,y) x = min(x,y) #define Clear(x) memset(x,0,sizeof(x)) /*#pragma comment(linker, "/STACK:1024000000,1024000000")int size = 256 << 20; // 256MB char *p = (char*)malloc(size) + size; __asm__("movl %0, %%esp\n" :: "r"(p) );*/char IN; bool NEG; inline void Int(int &x){NEG = 0;while(!isdigit(IN=getchar()))if(IN=='-')NEG = 1;x = IN-'0';while(isdigit(IN=getchar()))x = x*10+IN-'0';if(NEG)x = -x; } inline void LL(ll &x){NEG = 0;while(!isdigit(IN=getchar()))if(IN=='-')NEG = 1;x = IN-'0';while(isdigit(IN=getchar()))x = x*10+IN-'0';if(NEG)x = -x; }/******** program ********************/PII p[22]; int px[22],py[22]; int a[100],n; int dp[2][1<<21];int main(){#ifndef ONLINE_JUDGEfreopen("sum.in","r",stdin);//freopen("sum.out","w",stdout); #endifwhile(RD(n),~n){rep1(i,n)RD2(p[i].first,p[i].second);sort(p+1,p+n+1);rep1(i,n)px[i] = p[i].first , py[i] = p[i].second;int tp = 0;rep1(i,n) // 處理出所有可以組成的正方形REP(j,i+1,n)if(px[i]==px[j])REP(k,j+1,n)if(py[i]==py[k]||py[j]==py[k])REP(l,k+1,n)if(px[k]==px[l])if( (py[i]==py[k]&&py[j]==py[l])||(py[i]==py[l]&&py[j]==py[k]) )if( abs(px[i]-px[k])==abs(py[i]-py[j]) )a[++tp] = (1<<(i-1))|(1<<(j-1))|(1<<(k-1))|(1<<(l-1));Clear(dp);int all = 1<<n;int ans = 0;rep1(i,tp) // 狀態壓縮for(int sta=all-1;sta>=0;sta--){dp[i&1][sta] = dp[!(i&1)][sta];if( (a[i]&sta)!=a[i] )continue;cmax( dp[i&1][sta] , dp[!(i&1)][sta-a[i]]+4 );cmax(ans,dp[i&1][sta]);}cout<<ans<<endl;}return 0; }

?

  

?

轉載于:https://www.cnblogs.com/yejinru/p/3323233.html

總結

以上是生活随笔為你收集整理的hdu 4739 状压DP的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。