题意:输入n,m表示n个点,m条边,求一条递增的序列的点数与末尾点连接的点个数的乘积最大值。
分析:dp跑一下,时间复杂度O(m)。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <cmath> #include <cstdlib> #include <map> using namespace std; long long sum[100005]; long long dp[100005]; int head[100005]; struct node { int v,next; }G[200005]; int k=1; void add(int u, int v) { G[k].v = v; G[k].next = head[u]; head[u] = k++; } int main() { int n, m; int x, y; scanf("%d %d", &n, &m); for(int i=1; i<=m; i++) { scanf("%d%d", &x, &y); sum[x]++; sum[y]++; if(x<y) add(y,x); else add(x,y); } long long ans = 1; int v; for(int i=1; i<=n; i++) { dp[i] = 1; for(int j=head[i]; j!=0; j=G[j].next) { v = G[j].v; dp[i] = max(dp[v]+1, dp[i]); } ans=max(ans, sum[i]*dp[i]); } printf("%lld\n", ans); return 0; }
时间: 2024-10-23 17:19:28