心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
Tree_DP。
要注意到树枝上的苹果个数有可能是0个,所以一开始构图的时候不能用g[i][j]==0表示结点i和j之间没有边。
以下是我的代码:
#include<iostream>
#include
<string.h>
#define maxn 107
#define max(a,b) (a>b?a:b)
using namespace std;
struct
{
    
long l,r;
}tree[maxn];
long n,m,g[maxn][maxn],d[maxn][maxn];
bool used[maxn];

void build_tree(long node)
{
    
bool first=true;
    used[node]
=true;
    
for(long i=1;i<=n;i++)
        
if(!used[i]&&g[node][i]!=-1)
        {
            
if(first)
            {
                tree[node].l
=i;
                first
=false;
            }
            
else
                tree[node].r
=i;
            build_tree(i);
        }
}
long dp(long i,long j)
{
    
if(d[i][j]!=-1return d[i][j];
    d[i][j]
=0;
    d[i][j]
=max(dp(tree[i].l,j-1)+g[i][tree[i].l],dp(tree[i].r,j-1)+g[i][tree[i].r]);
    
for(long k=0;j-k-2>=0;k++)
        d[i][j]
=max(d[i][j],dp(tree[i].l,k)+dp(tree[i].r,j-k-2)+g[i][tree[i].l]+g[i][tree[i].r]);
    
return d[i][j];
}
int main()
{
    
/*
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    //
*/
    cin
>>n>>m;
    memset(g,
-1,sizeof(g));
    
for(long i=1;i<=n-1;i++)
    {
        
long a,b,w;
        cin
>>a>>b>>w;
        g[a][b]
=g[b][a]=w;
    }
    
//  Input
    memset(tree,0,sizeof(tree));
    memset(used,
false,sizeof(used));
    build_tree(
1);
    
//  Build Tree
    
    
/*
    for(long i=1;i<=n;i++)
        cout<<tree[i].l<<" "<<tree[i].r<<endl;
    //
*/
    
    
for(long i=0;i<=n;i++)
        
for(long j=0;j<=n;j++)
            d[i][j]
=-1;
    
for(long i=0;i<=n;i++)
        d[
0][i]=d[i][0]=0;
    
//  Init
    cout<<dp(1,m)<<endl;
    
//  Dp & Output
return 0;
}


posted on 2010-09-12 13:19 lee1r 阅读(235) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:动态规划

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理