【动态规划+想法】HDU - 3562 - Interesting Tour

本文解析了HDU 3562题目,通过动态规划求解节点间最多能形成多少个简单环的问题。介绍了dp[i][j]的概念,即节点i和j之间最多可以有多少个其他节点,并详细阐述了如何更新dp数组。

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=3562


题意

一开始有三个节点两两相连。
然后新加一个节点与已存在的两个节点a,b相连。其中a和b本身已经相连。
问最后形成的图的简单环最大是多少。


题解

d p [ i ] [ j ] dp[i][j] dp[i][j]表示 i i i j j j之间最多有多少个点。
然后就是要反过来更新这个 d p dp dp数组。嗯,这是关键。


#include<bits/stdc++.h>
#include<math.h>
using namespace std;
const int N=1e3+7;
int dp[N][N];
int aa[N],bb[N];
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        memset(dp,0,sizeof(dp));
        int ans=0;
        for(int i=4;i<=n;i++){
            scanf("%d%d",&aa[i],&bb[i]);
        }
        for(int i=n,a,b;i>=4;i--){
            a=aa[i],b=bb[i];
            ans=max(ans,dp[a][i]+dp[i][b]+dp[a][b]+3);
            dp[a][b]=dp[b][a]=max(dp[a][b],dp[a][i]+dp[i][b]+1);
        }
        ans=max(ans,dp[1][2]+dp[2][3]+dp[1][3]+3);
        printf("%d\n",ans);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值