HDU - 1160 DP(경로)

4223 단어 DP

FatMouse’s Speed


제목 대의:


길이가 1000을 넘지 않는 서열을 하나 주고, 원소마다 두 개의 숫자 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이 와이

데이터 범위:


1≤길이≤1000,1≤wi,vi≤100001≤길이≤1000,1≤wi,vi≤10000.

문제 해결 방법:


입력이 얼마나 많은 데이터를 입력했는지 알려주지 않았으니 처리해야 한다.그리고 직접 v강하 순서에 따라 순서를 정한 후 w의 최장 상승 서열을 구하면 된다. 경로를 구하면 하나의pre가 이동할 때마다pre값을 바꾸고 마지막에 출력을 되돌려주면 된다. 구체적인 코드는 다음과 같다.

AC 코드:

#include
#include
#include
#include
#include
using namespace std;
const int maxn = 1000;
struct NOOD {
    int cnt, pre;
}dp[maxn + 5];
struct Mouse{
    int w, v, pos;
}num[maxn + 5];
int n;
bool cmp(Mouse x, Mouse y) {// v  
    return x.v > y.v;
}
void print(int x) {//    
    if(x == -1)return ;
    print(dp[x].pre);
    printf("%d
"
, num[x].pos); } int main() { n = 1; while(~scanf("%d%d", &num[n].w, &num[n].v)) { num[n].pos = n++; } n--; sort(num + 1, num + n + 1, cmp); for(int i = 1; i <= n; i++)dp[i].pre = -1, dp[i].cnt = 0; for(int i = 1; i <= n; i++) { for(int j = 1; j < i; j++) { if(num[i].w > num[j].w && num[i].v < num[j].v) { if(dp[j].cnt + 1 > dp[i].cnt) {// dp[i].cnt = dp[j].cnt + 1; dp[i].pre = j; } } } if(dp[i].cnt == 0)dp[i].cnt = 1;// , } int Max = 1, pos = 1; for(int i = 1; i <= n; i++) { if(Max < dp[i].cnt) { Max = dp[i].cnt; pos = i; } } printf("%d
"
, Max); print(pos); return 0; }

좋은 웹페이지 즐겨찾기