【HDU】 1160 FatMouse's Speed (DP)

1583 단어
처음에 쓴 dfs를 기억화한 결과 경로를 어떻게 기록해야 할지 모르겠어요...순환으로 바꿨으면 좋겠어요.
dp[i] = max(dp[j]) + 1 , weight[j] < weight[j] && speed[j] > speed[i]
처음에 순서를 한 번 정하면 무게가 점차 늘어나는데, 이렇게 하면 속도만 고려하면 된다.
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 10005;
struct Mouse{
    int w,s,id;
    friend bool operator < (Mouse p,Mouse q){
        return p.w < q.w;
    }
}mouse[maxn];
int cnt = 1;
int dp[maxn];
int pre[maxn];
void print_path(int pos){
    if(pos == 0) return;
    print_path(pre[pos]);
    printf("%d
",pos); } void debug(){ for(int i = 1; i < cnt; i++) printf("(%d %d %d)
",mouse[i].w,mouse[i].s,mouse[i].id); } int main(){ while(scanf("%d%d",&mouse[cnt].w,&mouse[cnt].s) != EOF){ //if(mouse[cnt].w == 0) break; dp[cnt] = 1; mouse[cnt].id = cnt; pre[cnt] = 0; cnt ++; } sort(mouse + 1,mouse + cnt); //debug(); int ans = 0,start = 0; for(int i = 1; i < cnt; i++){ for(int j = 1; j < i; j++){ if(mouse[j].w < mouse[i].w && mouse[j].s > mouse[i].s){ if(dp[j] + 1 > dp[i]){ dp[i] = dp[j] + 1; pre[mouse[i].id] = mouse[j].id; } } } if(ans < dp[i]){ start = mouse[i].id; ans = dp[i]; } } printf("%d
",ans); print_path(start); return 0; } /* 1 2 3 4 5 6 7 9 9 10 3 8 */

좋은 웹페이지 즐겨찾기