【DP】SRM674D2L3 VampireTreeDiv2

xiaoxiao2025-10-31  4

题意:

分析:

#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #define SF scanf #define PF printf #define MAXN 1010 #define INF 0x3FFFFFFF #define MOD 1000000007 using namespace std; typedef long long ll; vector<int> son[MAXN],ison[MAXN],spe; ll dp[MAXN][2],calc[MAXN][2],minans=INF,tot; int sta[MAXN]; void dfs(int x){ dp[x][0]=0,dp[x][1]=1; calc[x][0]=1,calc[x][1]=1; for(int i=0;i<int(son[x].size());i++){ int u=son[x][i]; dfs(u); dp[x][0]+=dp[u][1]; calc[x][0]=calc[x][0]*calc[u][1]%MOD; if(dp[u][0]<dp[u][1]){ dp[x][1]+=dp[u][0]; calc[x][1]=calc[x][1]*calc[u][0]%MOD; } else if(dp[u][0]>dp[u][1]){ dp[x][1]+=dp[u][1]; calc[x][1]=calc[x][1]*calc[u][1]%MOD; } else{ dp[x][1]+=dp[u][0]; calc[x][1]=calc[x][1]*(calc[u][0]+calc[u][1])%MOD; } } for(int i=0;i<int(ison[x].size());i++) if(sta[ison[x][i]]==0){ dp[x][0]=INF; calc[x][0]=0; break; } if(sta[x]==0){ dp[x][1]=INF; calc[x][1]=0; } if(sta[x]==1){ dp[x][0]=INF; calc[x][0]=0; } // PF("<%d %lld %lld %lld>\n",x,dp[x][0],dp[x][1]); } class VampireTreeDiv2{ public: int countMinSamples(vector<int> pp1,vector<int> pp2){ memset(sta,-1,sizeof sta); int n=pp1.size(); // SF("%d",&n); // pp1.resize(n); // pp2.resize(n); // for(int i=0;i<n;i++) // SF("%d",&pp1[i]); // for(int i=0;i<n;i++) // SF("%d",&pp2[i]); for(int i=0;i<n;i++){ if(pp1[i]<pp2[i]) swap(pp1[i],pp2[i]); if(pp2[i]==-1) son[pp1[i]].push_back(i+1); else{ son[pp1[i]].push_back(i+1); ison[pp2[i]].push_back(i+1); spe.push_back(i+1); } } int cnt=spe.size(); for(int mask=0;mask<(1<<cnt);mask++){ for(int j=0;j<cnt;j++){ if((mask>>j)&1) sta[spe[j]]=0; else sta[spe[j]]=1; } dfs(0); if(dp[0][0]<minans){ minans=dp[0][0]; tot=calc[0][0]; } else if(dp[0][0]==minans){ tot=(tot+calc[0][0])%MOD; } if(dp[0][1]<minans){ minans=dp[0][1]; tot=calc[0][1]; } else if(dp[0][1]==minans){ tot=(tot+calc[0][1])%MOD; } // PF("[%d %lld]\n",mask,minans); } return tot; // PF("%lld",tot); } };
转载请注明原文地址: https://www.6miu.com/read-5038849.html

最新回复(0)