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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[BOJ]11048(python)python 풀이 DP를 이용해 풀이 보통 이런 문제는 dfs나 bfs로 풀이하는 것이여서 고민을 했는데 이 문구 덕분에 DP 를 이용해 풀이할 수 있었다 뒤로 돌아가는 등의 경우를 고려하지 않아도 되기 때문이다 코...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.