【树形dp】PKU-3345-Bribing FIPA
2012-03-26 20:54
302 查看
dp[i][j]表示在以i为根的树选j个国家的最少费用,具体思维看代码……
题目
题目
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<queue> #include<map> #include<stack> using namespace std; #define FRE freopen("a.txt","r",stdin); #define inf 999999999 #define N 205 vector<int> v ; int m,w ,dp ; int dfs(int now) { dp[now][0]=0; int sum=1,t ; int len=v[now].size(); for(int i=0;i<len;i++) { int u=v[now][i]; t[i]=dfs(u); sum+=t[i]; } if(now==0)sum--; for(int i=0;i<len;i++) { int u=v[now][i]; for(int j=sum-1;j>=0;j--) //逆序求,防止覆盖 { if(dp[now][j]==inf)continue; for(int k=1;k<=t[i];k++) { dp[now][j+k]=min(dp[now][j+k],dp[now][j]+dp[u][k]); } } } dp[now][sum]=w[now]; //把这个子树都选的费用 return sum; } int main() { //FRE; int n,vis ; while(scanf("%d%d",&n,&m)&&n) { for(int i=0;i<=n;i++)v[i].clear(); map<string,int> map; map.clear(); int l=1; memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { char s[105]; scanf("%s",s); if(!map[s])map[s]=l++; int x=map[s]; scanf("%d",w+x); while(getchar()==' ') //这里要特别注意了,因为后面可能跟着很多国家 { scanf("%s",s); if(!map[s])map[s]=l++; int y=map[s]; vis[y]=1; v[x].push_back(y); } } w[0]=0; //这里忘了初始化,wa了几次 for(int i=1;i<=n;i++) { if(vis[i])continue; v[0].push_back(i); //增加一个虚拟根 w[0]+=w[i]; } for(int i=0;i<=n;i++) { for(int j=0;j<=n;j++) { dp[i][j]=inf; } } dfs(0); int ans=inf; for(int i=m;i<=n;i++)ans=min(ans,dp[0][i]); printf("%d\n",ans); } return 0; }
相关文章推荐
- poj 3345 Bribing FIPA 树形dp
- (中等) 树形dp(分组背包) POJ 3345 Bribing FIPA
- poj 3345 Bribing FIPA 树形dp
- POJ 3345 Bribing FIPA 树形dp
- POJ 3345 Bribing FIPA 树形DP
- POJ3345 Bribing FIPA 【背包类树形dp】
- POJ 3345 Bribing FIPA 树形DP
- poj 3345 Bribing FIPA 【树形dp + 01背包】
- pku1848 Tree 树形DP
- 【树形dp】PKU-2486-Apple Tree
- pku 2057 The Lost House 树形dp+背包dp 解题报告
- 树形DP-Bribing FIPA
- POJ 3345——Bribing FIPA(树形DP)
- poj 3345 树形dp
- pku 3342 Party at Hali Bula 树形dp 解题报告
- pku 树形DP 1848 Tree 解题报告
- pku3345 Bribing FIPA
- poj 3345 Bribing FIPA(树形dp)
- pku 1848 Tree(有点麻烦的树形DP)
- POJ 3345 HDU 2415 Bribing FIPA(树形DP)