@[fangzichang](/user/678087)
题解的解题思路是正确的,但是实现有小问题,对于边界测试数据:
```
1
1
```
无法得到正确结果(实际上,第一篇和第二篇的题解所附的参考代码均无法获得 `Accepted`)。
您的代码中主要有两处小错误,原因在于对解题思路并未彻底理解就开始着手实现:
(1)题面给定的是不下降序列,则需要取等于号。
```
for (int i = 1; i <= n; i++)
{
dp[i] = 1;
for (int j = 1; j < i; j++)
{
//if (a[j] < a[i])
if (a[j] <= a[i])
{
if (dp[j] + 1 > dp[i])
{
// v[i].clear();
dp[i] = dp[j] + 1;
}
}
}
ans1 = max(ans1, dp[i]);
}
```
(2)建图发生错误,若 `len = 1`,您原来的建图逻辑就是错误的:
```
//if(dp[i]==1)add(s,i,1);
//else if(dp[i]==ans1)add(i+n,t,1);
if (dp[i] == 1) add(s, i, 1);
if (dp[i] == ans1) add(i + n, t, 1);
```
最后再考虑如何处理一下边界测试数据就可以通过了。可以提醒下管理员,前面两篇题解的参考代码有问题,需要标注下,以免误导初学者。
by metaphysis @ 2022-09-11 10:09:09
@[fangzichang](/user/678087)
对于目前测试数据,能够获得 `Accepted` 的代码:
```
#include <bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f
using namespace std;
const int N = 100010;
int n, m, s, t;
int head[N], to[N], nxt[N];
int dep[N], data[N], dp[N], a[N];
int cnt = 1;
int ans1, ans2;
void add(int u, int v, int w)
{
cnt++;
to[cnt] = v;
data[cnt] = w;
nxt[cnt] = head[u];
head[u] = cnt;
cnt++;
to[cnt] = u;
data[cnt] = 0;
nxt[cnt] = head[v];
head[v] = cnt;
}
int dfs(int u, int ru)
{
if (u == t)
return ru;
int chu = 0, res = 0, v = 0;
for (int p = head[u]; p; p = nxt[p])
{
v = to[p];
if (data[p] && dep[u] + 1 == dep[v])
{
res = dfs(v, min(data[p], ru));
data[p] -= res;
data[p ^ 1] += res;
ru -= res;
chu += res;
}
}
if (chu == 0)
dep[u] = -1;
//return chu;
return chu == inf ? 0 : chu;
}
bool bfs()
{
memset(dep, 0, sizeof(dep));
queue<int> q;
q.push(s);
dep[s] = 1;
while (q.size())
{
int u = q.front();
q.pop();
for (int p = head[u]; p; p = nxt[p])
{
int v = to[p];
if (data[p] && !dep[v])
{
dep[v] = dep[u] + 1;
q.push(v);
}
}
}
return dep[t];
}
signed main()
{
scanf("%lld", &n);
for (int i = 1; i <= n; i++)
{
scanf("%lld", &a[i]);
}
for (int i = 1; i <= n; i++)
{
dp[i] = 1;
for (int j = 1; j < i; j++)
{
//if (a[j] < a[i])
if (a[j] <= a[i])
{
if (dp[j] + 1 > dp[i])
{
// v[i].clear();
dp[i] = dp[j] + 1;
}
}
}
ans1 = max(ans1, dp[i]);
}
printf("%lld\n", ans1);
s = 0, t = n * 2 + 1;
for (int i = 1; i <= n; i++)
{
add(i, i + n, 1);
//if(dp[i]==1)add(s,i,1);
//else if(dp[i]==ans1)add(i+n,t,1);
if (dp[i] == 1) add(s, i, 1);
if (dp[i] == ans1) add(i + n, t, 1);
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j < i; j++)
{
if (a[j] <= a[i] && dp[j] == dp[i] - 1)
add(j + n, i, 1);
}
}
int ans2 = 0;
while (bfs())
{
//ans2 += dfs(s, 1e18);
ans2 += dfs(s, inf);
}
printf("%lld\n", ans2);
add(1, 1 + n, inf);
add(s, 1, inf);
if (dp[n] == ans1)
{
add(n * 2, t, inf);
add(n, n * 2, inf);
}
while (bfs())
{
//ans2 += dfs(s, 1e18);
ans2 += dfs(s, inf);
}
printf("%lld\n", ans2);
return 0;
}
```
by metaphysis @ 2022-09-11 10:15:50
@[metaphysis](/user/333388) 感谢大佬,讲得很仔细,关注送上
by fangzichang @ 2022-09-11 11:27:53
@[metaphysis](/user/333388) Accepted,感谢
by fangzichang @ 2022-09-11 13:24:39
海亮巨佬爆切网络流紫题
by Algae_qwq @ 2022-09-21 20:56:09
@[yc_ldh](/user/492010) %%%每次见巨佬都会得到新的教诲
by fangzichang @ 2022-09-24 21:05:11
@[fangzichang](/user/678087) 您吊打我,我只会暴力
by Algae_qwq @ 2022-09-24 21:07:38