码迷,mamicode.com
首页 > 其他好文 > 详细

HDU-3183-A Magic Lamp-RMQ+ST(模板)

时间:2015-08-04 11:14:23      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:hdu3183   a magic lamp   rmq模板   st算法   数据结构   

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

RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题。

ST(实质是动态规划),O(nlogn)-O(q) online。

ST算法(Sparse Table),以求最大值为例,设d[i,j]表示[i,i+2^j-1]这个区间内的最大值,那么在询问到[a,b]区间的最大值时答案就是max(d[a,k], d[b-2^k+1,k]),其中k是满足2^k<=b-a+1(即长度)的最大的k,即k=[ln(b-a+1)/ln(2)]。
d的求法可以用动态规划,d[i, j]=max(d[i, j-1],d[i+2^(j-1), j-1])。

第一次写这种类型的题目,这里有一个很好的博客推荐,分别写出了返回下标和返回值的模板,可以看着学一下,链接:http://blog.csdn.net/allenjy123/article/details/6629272

#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
#include<cmath>
#include<stack>
#include<set>
#include<vector>
#include<algorithm>
#define LL long long
#define inf 1<<30
using namespace std;
const int N=1035;
int n,m;
int dp[N][25];      //  把这个数组写成了char型的,WA到死啊。。。orz...
char s1[N];
char ans[N];
int Min(int a,int b)    //  返回下标;
{
    return s1[a]<=s1[b]?a:b;
}
void make_rmq()  //  返回下标的RMQ;
{
    for(int i=0;i<n;i++) dp[i][0]=i;    //  长度为0的初始值;
    for(int j=1;(1<<j)<n;j++){
        for(int i=0;i+(1<<j)-1<n;i++){
            dp[i][j]=Min(dp[i][j-1],dp[i+(1<<j-1)][j-1]);
        }
    }
}
int query_rmq(int s,int v)  //  查询;
{
    int k=(int)((log((v-s+1)*1.0))/(log(2.0))); //  对数换底公式,求K的长度;
    return Min(dp[s][k],dp[v-(1<<k)+1][k]);
}
int main()
{
    while(~scanf("%s %d",s1,&m)){
        n=strlen(s1);   //  存储输入字符串的长度;
        make_rmq();
        int t=n-m;      //  要输出的长度;
        int q=0,p=0;
        while(t--){
            q=query_rmq(q,m++);   //  查询从下标q开始下标为m的最小值;(这里需要好好理解)
            ans[p++]=s1[q++];
        }
        for(q=0;q<p;q++) if(ans[q]!='0')break;
        if(p==q) printf("0");
        else while(q<p) printf("%c",ans[q++]);
        printf("\n");
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU-3183-A Magic Lamp-RMQ+ST(模板)

标签:hdu3183   a magic lamp   rmq模板   st算法   数据结构   

原文地址:http://blog.csdn.net/wlxsq/article/details/47273349

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!