【HDU】 1160 FatMouse's Speed (DP)

一开始写的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\n",pos);
}
void debug(){
    for(int i = 1; i < cnt; i++)
        printf("(%d %d %d)\n",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\n",ans);
    print_path(start);
    return 0;
}
/*
1 2
3 4
5 6
7 9
9 10
3 8
*/

【HDU】 1160 FatMouse's Speed (DP)

时间: 2024-10-12 17:55:00

【HDU】 1160 FatMouse's Speed (DP)的相关文章

[HDOJ1160]FatMouse&#39;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 sequen

【BZOJ】1055: [HAOI2008]玩具取名(dp)

http://www.lydsy.com/JudgeOnline/problem.php?id=1055 我竟然都没往dp这个方向想.....百度了下看到标题是dp马上就会转移了QAQ... 设d[i,j,k]表示i~j是否能转移成k. 那么很显然.. d[i,j,k]=d[i,k,x]&&d[k+1,j,y]&&a[k,x,y],a[k,x,y]表示k能转移到xy. 然后我数组小了re..(我都开了202啦........... 然后没有判误解wa了......太sb..

【Luogu】P1854花店橱窗布置(DP)

照例良心题目链接 此题使用f[i][j]表示前i束花放进前j个花瓶的时候的最大值.转移方程如下 f[i][j]=max(f[i][j-1],f[i-1][j-1]+que[i][j]) 其中que[i][j]表示第i束花放进第j个花瓶里的情况.有这个转移方程的原因是,每一束花在每一个花瓶里的情况只有两种:放进去了和没放进去.第一种f[i][j-1]就是没放进去,第二种 f[i-1][j-1]+que[i][j]就是放进去了的情况 特殊的,当i>=j时第一种情况不能成立 路径保存死活没想出来,最后

【Luogu】P1941飞扬的小鸟(DP)

我发现现在没了题解我做普及提高+的题也做不了 更不要说这些提高+难度的?题 此题是一个二维DP.暴力是三重循环ijk,k枚举在i位置上的点击次数.即 for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) for(int k=1;j-k*up[i]>0;k++)    f[i][j]=min(f[i][j],f[i][k]+k); 这样的暴力能拿到80分.但是很不幸,我一开始搞错了,所以只拿了60,剩下20是TLE. 后来发现可以把水管放在外面计算.也就是

【BZOJ】1090: [SCOI2003]字符串折叠(dp)

http://www.lydsy.com/JudgeOnline/problem.php?id=1090 随便yy一下.. 设f[i,j]表示i-j的最小长度 f[i, j]=min{j-i+1, f[i,k]+f[k+1, j], count[x]+2+f[i, i+x-1]},其中count[x]表示x的位数,最后边的转移那个条件是i~j都是长度为x的串连在一起. 然后最后那个转移暴力233可以水过... #include <cstdio> #include <cstring>

【Luogu】P2389电脑班的裁员(DP)

题目链接 sbt交了三遍才过是我的耻辱…… 就是设f[i][j]搞个三重循环DP一下,以上. #include<cstdio> #include<cstdlib> #include<cctype> #include<algorithm> #include<cstring> #define maxn 550 using namespace std; inline long long read(){ long long num=0,f=1; char

【题解】P1412 经营与开发(DP)

Description 给出 \(n\) 个星球,每个星球有一个类型,如果该星球 \(i\) 类型是 \(1\) 则我们可以在它上面挖钻,可以得到 \(a[i] \times p\) 的价值(p是我们的钻头的属性),每次用完之后属性会变成 \(p \times (1-0.01 \times k\). 如果类型是 \(2\),我们可以在上面修理钻头,花费 \(b[i]*p\) 的价格可以让我们的钻头属性变成 \(p \times (1+0.01 \times c)\).输出最大可以获得的价值.可以

hdu 1160 FatMouse&#39;s Speed(最长不下降子序列+输出路径)

题意: 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 s

HDU 1160 FatMouse&#39;s Speed (最长有序的上升子序列)

题意:给你一系列个w,s,要你找到最长的n使得 W[m[1]] < W[m[2]] < ... < W[m[n]] and S[m[1]] > S[m[2]] > ... > S[m[n]] 即在这n个w,s中满足w[i]<w[j]&&s[i]>s[j],要求:体重严格递增,速度严格递减,原始顺序不定 首先将s从大到小排序,即顺数固定后转化为最长上升子序列问题. 案例: 6008 1300 6000 2100 500 2000 1000 40