http://codeforces.com/problemset/problem/615/B
题目大意:
给出一个n个点m条边的无向无环图(不一定全联通),求一条递增链长度与尾节点个数乘积的最大值。
解题思路:
设dp[i]表示以节点i结尾的最长的递增链长度,那么只要比较每个点的dp[i]值与对应点的节点个数乘积即可。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
struct node{
int x,y;
}s[maxn];
int n,m;
ll num[maxn],dp[maxn];
bool cmp(node a,node b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
int main()
{
while(cin>>n>>m)
{
memset(dp,0,sizeof(dp));
memset(num,0,sizeof(num));
for(int i=0;i<m;i++)
{
cin>>s[i].x>>s[i].y;
if(s[i].x>s[i].y)
swap(s[i].x,s[i].y);
num[s[i].x]++,num[s[i].y]++;
}
sort(s,s+m,cmp);
for(int i=0;i<m;i++)
dp[s[i].y]=max(dp[s[i].y],dp[s[i].x]+1);
ll ans=0;
for(int i=1;i<=n;i++)
ans=max(ans,(dp[i]+1)*num[i]);
cout<<ans<<endl;
}
return 0;
}

本文解析了Codeforces上编号为615/B的问题,该问题是关于在一个无向无环图中寻找最长递增链与尾节点个数乘积的最大值。通过动态规划方法,对每个节点计算其作为递增链尾部的最长链长,并与该节点的邻居数量相乘,最终找出最大值。
&spm=1001.2101.3001.5002&articleId=81504282&d=1&t=3&u=e5e6de2861b14db4b5f6a73103f11a01)
469

被折叠的 条评论
为什么被折叠?



