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