HDU 5691 Sitting in Line
阿新 • • 發佈:2017-09-05
target name 判斷 namespace ans true 如果 直接 spa
題目:http://acm.hdu.edu.cn/showproblem.php?pid=5691
帶一點變形的狀壓dp
先預處理出所有能放在首位的狀態
之後判斷是如果是-1直接轉移,否則要先判斷現在是放第幾位,相等才能轉移
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<map> #include<set> using namespace std; const int N=20; const int inf=2e9; int a[N],p[N]; int dp[1<<16][16]; int f(int x) { int s=0; while(x) { s++; x-=x&-x; } return s; } int main() { int T; scanf("%d",&T); for(int ca=1;ca<=T;ca++) { int n; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d%d",&a[i],&p[i]); int tot=1<<n; for(int i=0;i<tot;i++) for(int j=0;j<n;j++) dp[i][j]=-inf; for(int i=0;i<n;i++) if (p[i]==0||p[i]==-1) dp[1<<i][i]=0; for(int i=0;i<tot;i++) { for(int j=0;j<n;j++) { if (dp[i][j]==-inf) continue; for(int k=0;k<n;k++) { if (i>>k&1) continue; if (p[k]==-1||f(i)==p[k]) dp[i|1<<k][k]=max(dp[i|1<<k][k],dp[i][j]+a[j]*a[k]); } } } int ans=-inf; for(int i=0;i<n;i++) ans=max(ans,dp[tot-1][i]); printf("Case #%d:\n%d\n",ca,ans); } return 0; }
HDU 5691 Sitting in Line