진화 게임 (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;
}