补题——dp(Evolution Game)

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;
}

猜你喜欢

转载自blog.csdn.net/rookie636/article/details/108803693