zoukankan      html  css  js  c++  java
  • [HDOJ1160]FatMouse's Speed(DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160

    FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to take the data on a collection of mice and put as large a subset of this data as possible into a sequence so that the weights are increasing, but the speeds are decreasing.

    给一组w s,找出一个最长的序列,使得w是严格单调递增而且s是严格单调递减的。

    两种做法,分别是关注w和关注s。

    关注w:相当于是在s上求最长下降子序列。

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <iomanip>
     4 #include <cstring>
     5 #include <climits>
     6 #include <complex>
     7 #include <fstream>
     8 #include <cassert>
     9 #include <cstdio>
    10 #include <bitset>
    11 #include <vector>
    12 #include <deque>
    13 #include <queue>
    14 #include <stack>
    15 #include <ctime>
    16 #include <set>
    17 #include <map>
    18 #include <cmath>
    19 
    20 using namespace std;
    21 
    22 typedef struct Node {
    23     int w;
    24     int s;
    25     int idx;
    26 }Node;
    27 
    28 const int maxn = 1111;
    29 Node mice[maxn];
    30 int n, ans;
    31 int dp[maxn];
    32 int pre[maxn];
    33 int st[maxn];
    34 int top;
    35 
    36 bool cmp(Node a, Node b) {
    37     if(a.w == b.w) return a.s > b.s;
    38     return a.w < b.w;
    39 }
    40 
    41 int main() {
    42     // freopen("in", "r", stdin);
    43     // freopen("out", "w", stdout);
    44     n = 1;
    45     while(~scanf("%d %d", &mice[n].w, &mice[n].s)) {
    46         mice[n].idx = n;
    47         n++;
    48     }
    49     n--;
    50     sort(mice + 1, mice + n + 1, cmp);
    51     ans = 0;
    52     int pos;
    53     memset(dp, 0, sizeof(dp));
    54     memset(pre, -1, sizeof(pre));
    55     for(int i = 1; i <= n; i++) {
    56         dp[i] = 1;
    57         for(int j = 1; j < i; j++) {
    58             if(dp[i] < dp[j] + 1 &&
    59                 mice[i].s < mice[j].s &&
    60                 mice[i].w > mice[j].w) {
    61                 dp[i] = dp[j] + 1;
    62                 pre[mice[i].idx] = mice[j].idx;
    63             }
    64         }
    65         if(ans < dp[i]) {
    66             ans = dp[i];
    67             pos = mice[i].idx;
    68         }
    69     }
    70     top = 0;
    71     for(int i = pos; ~i; i=pre[i]) st[top++] = i;
    72     printf("%d
    ", ans);
    73     while(top) printf("%d
    ", st[--top]);
    74     return 0;
    75 }
    View Code

    关注s:相当于是在w上求最长上升子序列。

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <iomanip>
     4 #include <cstring>
     5 #include <climits>
     6 #include <complex>
     7 #include <fstream>
     8 #include <cassert>
     9 #include <cstdio>
    10 #include <bitset>
    11 #include <vector>
    12 #include <deque>
    13 #include <queue>
    14 #include <stack>
    15 #include <ctime>
    16 #include <set>
    17 #include <map>
    18 #include <cmath>
    19 
    20 using namespace std;
    21 
    22 typedef struct Node {
    23     int w;
    24     int s;
    25     int idx;
    26 }Node;
    27 
    28 const int maxn = 1111;
    29 Node mice[maxn];
    30 int n, ans;
    31 int dp[maxn];
    32 int pre[maxn];
    33 int st[maxn];
    34 int top;
    35 
    36 bool cmp(Node a, Node b) {
    37     if(a.s == b.s) return a.w < b.w;
    38     return a.s > b.s;
    39 }
    40 
    41 int main() {
    42     // freopen("in", "r", stdin);
    43     // freopen("out", "w", stdout);
    44     n = 1;
    45     while(~scanf("%d %d", &mice[n].w, &mice[n].s)) {
    46         mice[n].idx = n;
    47         n++;
    48     }
    49     n--;
    50     sort(mice + 1, mice + n + 1, cmp);
    51     ans = 0;
    52     int pos;
    53     memset(dp, 0, sizeof(dp));
    54     memset(pre, -1, sizeof(pre));
    55     for(int i = 1; i <= n; i++) {
    56         dp[i] = 1;
    57         for(int j = 1; j < i; j++) {
    58             if(dp[i] < dp[j] + 1 &&
    59                mice[i].w > mice[j].w) {
    60                 dp[i] = dp[j] + 1;
    61                 pre[mice[i].idx] = mice[j].idx;
    62             }
    63         }
    64         if(ans < dp[i]) {
    65             ans = dp[i];
    66             pos = mice[i].idx;
    67         }
    68     }
    69     top = 0;
    70     for(int i = pos; ~i; i=pre[i]) st[top++] = i;
    71     printf("%d
    ", ans);
    72     while(top) printf("%d
    ", st[--top]);
    73     return 0;
    74 }
    View Code

    注意小心关注w时s相等的情况和关注s时w相等的情况。不知道为什么,关注w时没有注意s相等的代码可以AC但是关注s的时候必须要注意w相等要continue掉。应该是数据水了吧。

  • 相关阅读:
    Use Prerender to improve AngularJS SEO
    Prerender.io
    Prerender Application Level Middleware
    Prerender Application Level Middleware
    正则获取html标签字符串中图片地址
    xml转json
    videojs实现双击视频全屏播放、播放器全屏时视频未全屏
    自己编写jquery插件
    点击回退时需要点击2次才可返回js
    if中有逗号的写法
  • 原文地址:https://www.cnblogs.com/kirai/p/5398026.html
Copyright © 2011-2022 走看看