Evolution Game(dp思路)
题意:有一只怪兽,他需要进化,给你怪兽每种形态的角的数量和眼的数量,角只能越进化越多,而眼睛是一个范围。你可以选择任意一个形态作为初始的形态,求最多能进化多少次。
错误思路和WA的代码
当时看数据不大,以为可以暴力遍历,然后求最大值,结果一直WA。这种思路会自动选择要分叉时的第一个符合条件的值,从而有可能落下最优解。
*#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct node
{
int a, b;
} s[5050];
bool cmp(node c, node d)
{
return c.a < d.a;
}
int main()
{
int n, w, i, j;
cin >> n >> w;
for (i = 1; i <= n; i++)
{
cin >> s[i].a;
s[i].b = i;
}
sort(s + 1, s + n + 1, cmp);
int numm = 0;
for (j = 1; j <= n; j++)
{
int m = s[j].b, num = 0, k = s[j].a;
for (i = j + 1; i <= n; i++)
{
if (s[i].b >= m - w && s[i].b <= m + w && s[i].a > k)
{
m = s[i].b;
k = s[i].a;
num++;
}
}
if (numm < num)
numm = num;
}
cout << numm;
return 0;
}
dp代码和注释
#include <bits/stdc++.h>
using namespace std;
#define maxn 5050
int h[maxn];
struct node {
int h, e;
}a[maxn];
bool cmp(node x, node y) //sort内置结构体排序函数
{
return x.h < y.h;
}
int dp[maxn];//dp数组存放每个点之前最大的进化次数
int main() {
int n, w;
cin >> n >> w;
for (int i = 1; i <= n; ++i)
{
cin >> a[i].h;
a[i].e = i;
}
sort(a + 1, a + 1 + n, cmp);//按照角的数量进行从小到大的排序
for (int i = 1; i <= n; ++i)
{
for (int j = i + 1; j <= n; ++j)
{
if (a[j].h > a[i].h && abs(a[j].e - a[i].e) <= w) //判断是否符合条件
{
dp[j] = max(dp[j], dp[i] + 1);//更新符合条件的点时最大的进化次数
}
}
}
int maxdp = 0;
for (int i = 1; i <= n; ++i)
maxdp = max(maxdp, dp[i]);//取最大值
cout << maxdp << endl;
return 0;
}