hdu1011Starship Troopers【树型dp】

来源:互联网 发布:淘宝箱包客服话术大全 编辑:程序博客网 时间:2024/05/22 05:13

这轮刷的树型dp最后一题~~和前两个题差不多,尤其是和poj1947Rebuilding Roads十分的相似 ,都怪自己又读错题了orz,题意是说可以找分支中的一部分,而我傻乎乎的以为只能找一条没有分叉的线,即使是下午毛概想明白了,但依旧不知道自己为啥一直数组越界,回溯的结构和上一个题一模一样,这个题是留下当前节点需要的,剩余的给子节点

#include <iostream>#include <vector>#include <cstring>#include <cstdio>using namespace std;const int Ni = 110;int n,m;int cos[Ni],weg[Ni];int dp[Ni][Ni];bool vis[Ni];vector<int> dv[Ni];inline int max(int a,int b){return a>b? a:b;}void dfs(int p){    int i,j,k;    int temp=(cos[p]+19)/20;    for(i=temp;i<=m;i++) dp[p][i]=weg[p];    vis[p]=1;    for(i=0;i<dv[p].size();i++)    {        int t=dv[p][i];        if(vis[t]) continue;        dfs(t);        for(j=m;j>=temp;j--)        {            for(k=1; k<=j-temp; k++)//留下temp攻打p                dp[p][j]=max(dp[p][j],dp[p][j-k]+dp[t][k]);        }    }}int main(){    int i;    while(scanf("%d%d",&n,&m),n!=-1||m!=-1)    {        for(i=0; i<=n; i++) dv[i].clear();        memset(dp,0,sizeof(dp));        memset(vis,0,sizeof(vis));        for(i=1; i<=n; i++)            scanf("%d%d",cos+i,weg+i);        for(i=1; i<n; i++)        {            int u,v;            scanf("%d%d",&u,&v);            dv[u].push_back(v);            dv[v].push_back(u);        }        if(m==0) {printf("0\n");continue;}        dfs(1);        printf("%d\n",dp[1][m]);    }    return 0;}

附上不知道为啥越界的代码:

/*******hdu10112015.12.29re*******/#include <iostream>#include<cstdio>#include<cstring>#include<vector>using namespace std;int val[120],vol[120];int n,m,tol,dp[120][120];bool vis[120];vector<int>num[120];int max(int a,int b){    if(a>b) return a;    return b;}void dfs(int p){    vis[p]=1;    int tmp=(val[p]+19)/20;   // if(tmp==0) tmp++;   if(tmp>=120) return;    for(int i=tmp;i<=m;i++) dp[p][i]=vol[p];    for(int i=0;i<num[p].size();i++)    {        int t=num[p][i];        if(vis[t]) continue;        dfs(t);        for(int j=m;j>=tmp;j--)        {            for(int k=1; k<=j-tmp; k++)//ÁôÏÂtemp¹¥´òp                dp[p][j]=max(dp[p][j],dp[p][j-k]+dp[t][k]);        }    }}int main(){   // freopen("cin.txt","r",stdin);    while(~scanf("%d%d",&n,&m))    {        if(m==-1&&n==-1) break;        for(int i=1;i<=n;i++)        {            scanf("%d%d",&val[i],&vol[i]);            num[i].clear();        }        if(m==0)        {            printf("0\n");            continue;        }        memset(dp,0,sizeof(dp));        memset(vis,0,sizeof(vis));        for(int i=1;i<n;i++)        {            int a,b;            scanf("%d%d",&a,&b);            num[a].push_back(b);            num[b].push_back(a);        }        dfs(1);        printf("%d\n",dp[1][m]);    }    return 0;}


明天就要校赛了,状态一点都不好T^T


0 0
原创粉丝点击