uva 10118 ——Free Candies
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                uva  10118 ——Free Candies
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                題意:桌子上有4 堆糖果,要從這四堆糖果中取出5個,如果5個中有相同的顏色則把他們拿出來放到口袋,求最多放多少糖果。
 
思路:DAG最長路問題。需要把問題轉(zhuǎn)化成DAG的問題,以個數(shù)作為轉(zhuǎn)移的狀態(tài),當(dāng)達(dá)到5的時候為0,否則就是選當(dāng)前的和不選當(dāng)前的最大值。
 
code:
#include <bits/stdc++.h> using namespace std;using namespace std;typedef long long ll; typedef unsigned long long ull; typedef long double ld;const int N=1000000; const int M=45; const int mod=1000000007; const double pi=acos(-1.0);#define cls(x,c) memset(x,c,sizeof(x)) #define ft(i,s,t) for (int i=s;i<=t;i++)int n; int vis[M],dp[M][M][M][M],tq[M]; int g[M][M];int sol(int ct) {int& ans=dp[tq[0]][tq[1]][tq[2]][tq[3]];if (ans!=-1) return ans;if (ct==5) return ans=0;ans=0;ft(i,0,3){if (tq[i]==n) continue;int cl=g[i][tq[i]];tq[i]++;if (vis[cl]){vis[cl]=0;ans=max(ans,sol(ct-1)+1);vis[cl]=1;}else{vis[cl]=1;ans=max(ans,sol(ct+1));vis[cl]=0;}tq[i]--;}return ans; } int main() {while (~scanf("%d",&n),n){ft(i,0,n-1) ft(j,0,3) scanf("%d",&g[j][i]);cls(tq,0);cls(vis,0);cls(dp,-1);printf("%d\n",sol(0));} }總結(jié)
以上是生活随笔為你收集整理的uva 10118 ——Free Candies的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 明日方舟蚀清精二需要什么材料
 - 下一篇: 红色摇篮剧情介绍