hdu 5064 Find Sequence(단순화 최적화 DP)

1772 단어 DPDP 최적화 문제

hdu 5064 Find Sequence


처음에 순서를 먼저 정한 다음에 둘씩 줄여서 LIS를 찾아내서 결과를 얻으려고 생각했는데, 분명히 주도면밀하게 고려하지 않았다
문제 풀이에 따라 이 문제는 단조로운 DP를 사용해야 한다.DP[i][j]는 시퀀스가 다음과 같이 i와 j로 끝나고, 변환 방정식은
DP[i][j] = max(DP[k][i] + 1) { k<=i && num[j] - num[i] >= num[i] - num[k] }
그러나 직접 구해 시간의 복잡도는 O(n^3)이다.이 상태 방정식은 특수한 성질을 가지고 있다. 즉,
k가 {k<=i & &num[j]-num[i]>=num[i]-num[k]}를 만족시키면 k는 j+1의 상황에서도 만족한다.그래서 j+1을 계산할 때 k는 바로 이전 상태에서 계속 진행할 수 있다.
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#ifdef __GNUC__
typedef long long LL;
inline void opt64(LL a)
{
    printf("%lld", a);
}
#else
typedef __int64 LL;
inline void opt64(LL a)
{
    printf("%I64d", a);
}
#endif
const int MAXN = (1<<22)+5;
const int MAXM = 2050;
const double eps = 1e-10;
const double PI = acos(-1.0);
inline int cmp(const double x, const double y)
{
    return ((x-y)>eps) - ((x-y)eps) - ((x)=0 && mq[j]-mq[i]>=mq[i]-mq[k]; --k)
            {
                ans = max(ans, dp[k][i]);
            }
            dp[i][j] = ans+1;
            res = max(res, ans+1);
        }
    }
    return res;
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
#endif
    int t;
    scanf("%d", &t);
    while (t--)
    {
        scanf("%d%d", &n, &m);
        for (int i = 0; i< n; ++i)
            scanf("%d", mp+i);
        printf("%d
", solve()); } return 0; }

좋은 웹페이지 즐겨찾기