1. 程式人生 > >upc組隊賽14 Evolution Game【dp】

upc組隊賽14 Evolution Game【dp】

輸出 idt present iterator inf har floor words function

Evolution Game

題目描述

In the fantasy world of ICPC there are magical beasts. As they grow, these beasts can change form, and every time they do they become more powerful. A beast cannot change form completely arbitrarily though. In each form a beast has n eyes and k horns, and these affect the changes it can make.

A beast can only change to a form with more horns than it currently has.
A beast can only change to a form that has a difference of at most w eyes. So, if the beast currently has n eyes it can change to a form with eyes in range [n - w, n + w].

A beast has one form for every number of eyes between 1 and N, and these forms will also have an associated number of horns. A beast can be born in any form. The question is, how powerful can one of these beasts become? In other words, how many times can a beast change form before it runs out of possibilities?

輸入

The first line contains two integers, N and w, that indicate, respectively, the maximum eye number, and the maximum eye difference allowed in a change (1 ≤ N ≤ 5000; 0 ≤ w ≤ N).
The next line contains N integers which represent the number of horns in each form. I.e. the ith number, h(i), is the number of horns the form with i eyes has (1 ≤ h(i) ≤ 1 000 000).

輸出

For each test case, display one line containing the maximum possible number of changes.

樣例輸入

5 5
5 3 2 1 4

樣例輸出

4

題意

角從小變大,在眼睛範圍w內的進化,問最多能進化幾次?

題解

一個比較明顯的dp,先對角進行排序,從後向前遍歷,滿足在w範圍內的就dp+1

代碼

#include<iostream>
#include<cstdio>  //EOF,NULL
#include<cstring> //memset
#include<cstdlib> //rand,srand,system,itoa(int),atoi(char[]),atof(),malloc
#include<limits.h> //INT_MAX
#include<bitset> // bitset<?> n
#include<cmath>  //ceil,floor,exp,log(e),log10(10),hypot(sqrt(x^2+y^2)),cbrt(sqrt(x^2+y^2+z^2))
#include<algorithm> //fill,reverse,next_permutation,__gcd,
#include<iomanip> //setw(set_min_width),setfill(char),setprecision(n),fixed,
#include<string>
#include<vector>
#include<queue>
#include<stack>
#include<utility>
#include<iterator>
#include<functional>
#include<map>
#include<set>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define scac(x) scanf("%c",&x)
#define sca(x) scanf("%d",&x)
#define sca2(x,y) scanf("%d%d",&x,&y)
#define sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define scl(x) scanf("%lld",&x)
#define scl2(x,y) scanf("%lld%lld",&x,&y)
#define scl3(x,y,z) scanf("%lld%lld%lld",&x,&y,&z)
#define pri(x) printf("%d\n",x)
#define pri2(x,y) printf("%d %d\n",x,y)
#define pri3(x,y,z) printf("%d %d %d\n",x,y,z)
#define prl(x) printf("%lld\n",x)
#define prl2(x,y) printf("%lld %lld\n",x,y)
#define prl3(x,y,z) printf("%lld %lld %lld\n",x,y,z)
#define ll long long
#define LL long long
#define read read()
#define pb push_back
#define mp make_pair
#define P pair<int,int>
#define PLL pair<ll,ll>
#define PI acos(1.0)
#define eps 1e-6
#define inf 1e17
#define INF 0x3f3f3f3f
#define N 5005
const int maxn = 2000005;
int n,w;

struct node
{
  int h,e,dp;
}a[N];
bool cmp(node a,node b)
{
  return a.h < b.h;
}
int main()
{
  sca2(n,w);
  rep(i,1,n+1)
  {
    sca(a[i].h);
    a[i].e = i;
  }
  sort(a+1,a+n+1,cmp);
  int l,r;
  for(int i = n; i >= 1;i--)
  {
    l = a[i].e - w,r = a[i].e + w;
    rep(j,i+1,n+1)
    {
      if(a[j].e >= l && a[j].e <= r && a[j].h > a[i].h)
      {
        a[i].dp = max(a[i].dp,a[j].dp+1);
      }
    }
  }
  int ans = a[1].dp;
  rep(i,2,n+1)
    ans = max(ans,a[i].dp);
  pri(ans);
}

upc組隊賽14 Evolution Game【dp】