hdu 1514 记忆化搜索
生活随笔
收集整理的這篇文章主要介紹了
hdu 1514 记忆化搜索
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意是給4堆(堆的高度小于等于40)有顏色(顏色的種類小于等于20)的物品,你有一個籃子最多能裝5件物品,每次從這4堆物品里面
任取一件物品放進籃子里,但是取每堆物品時,必須先取上面的物品,才能取下面的物品,如果發現籃子里
的兩種物品的顏色一樣,那么把這兩種物品拿出來,問最后最多能拿出多少對物品?;
解題思路:記憶化搜索+dp+狀態壓縮;
因為40×40×40×40不會太大,所以可以用dp[x[1]][x[2]][x[3]][x[4]]記錄搜索的狀態;
dp[x[1]][x[2]][x[3]][x[4]]記錄4堆分別從x[1],x[2],x[3],x[4]處往下取所獲得的最大值;
因為顏色種類最多20種,可以對籃子里的物品顏色用每個位來存儲,所以就用到了位狀態壓縮;
Sample Input
5
1 2 3 4
1 5 6 7
2 3 3 3
4 9 8 6
8 7 2 1
Sample Output
8
?
?
這題少說也拍過5遍了,好題啊
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=0x3f3f3f3f; 11 const double eps=1e-5; 12 #define cl(a) memset(a,0,sizeof(a)) 13 #define ts printf("*****\n"); 14 const int MAXN=1005; 15 int n,m,tt; 16 int dp[45][45][45][45]; 17 int c[45][5]; 18 int x[5]; //x[i]表示第i堆的狀態,并不是當前狀態,而是取走的狀態 19 int dfs(int b,int num) 20 { 21 if(dp[x[1]][x[2]][x[3]][x[4]]!=-1) return dp[x[1]][x[2]][x[3]][x[4]]; 22 int maxs=0,sum=0; 23 for(int i=1;i<=4;i++) 24 { 25 x[i]++; 26 if(x[i]<=n) 27 { 28 int bit=1<<(c[x[i]][i]); 29 if(b&bit) 30 { 31 sum=dfs(b&(~bit),num-1)+1; 32 } 33 else if(num<4) 34 { 35 sum=dfs(b|bit,num+1); 36 } 37 } 38 maxs=max(maxs,sum); 39 x[i]--; 40 } 41 return dp[x[1]][x[2]][x[3]][x[4]]=maxs; 42 } 43 int main() 44 { 45 int i,j,k; 46 #ifndef ONLINE_JUDGE 47 freopen("1.in","r",stdin); 48 #endif 49 while(scanf("%d",&n)!=EOF&&n!=0) 50 { 51 for(i=1;i<=n;i++) 52 { 53 for(j=1;j<=4;j++) 54 scanf("%d",&c[i][j]); 55 } 56 memset(dp,-1,sizeof(dp)); 57 x[1]=x[2]=x[3]=x[4]=0; 58 int ans=dfs(0,0); 59 printf("%d\n",ans); 60 } 61 }?
轉載于:https://www.cnblogs.com/cnblogs321114287/p/4455606.html
總結
以上是生活随笔為你收集整理的hdu 1514 记忆化搜索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Skeljs – 用于构建响应式网站的前
- 下一篇: 错误记录,找不到sqlite dll