学习笔记(3)

来源:互联网 发布:2016年网络热议话题 编辑:程序博客网 时间:2024/06/05 06:24

RMQ问题与LCA问题的转化,刚才在找博客的时候看到了,因为没有学DP,所以只好先放到以后再学,先拿个HDU3183练练手····又坑了···实在挑不出来了····

#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<set>
#include<algorithm>
#include<cmath>


#define ll __int64
#define MAX 1000009
using namespace std;


int a[MAX];
int dp[1009][1009];
int n;


int RMQ_init()
{
    for(int i=1;i<=n;i++)
        dp[i][0] = a[i];
    for(int j=1;(1<<j)<=n;j++)
        for(int i=1;i+j-1<=n;i++)
           dp[i][j] = max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
int RMQ(int l,int r)
{
    int k = 0;
    while((1<<(k+1))<=r-l+1) k++;
    return max(dp[l][k],dp[r-(1<<k)][k]);
}
int main()
{
    string b;
    int x,i,xx,yy;
    int MAXN = -1000000;
    while(cin>>b>>x)
    {
        int k = 1;
        int len = b.size();
        n = len;
        for(i=0;i<len;i++)
            a[k++] = b[i] - '0';
        RMQ_init();
        //cout<<RMQ(1,3)<<endl;
        for(i = 1;i<=n-x+1;i++)
        {
            if(MAXN<=RMQ(i,i+x-1))
            {
                MAXN = RMQ(i,i+x-1);
                cout<<MAXN<<endl;
                //cout<<RMQ(i,i+x-1)<<endl;
                xx = i;
                yy = i+x-1;
                cout<<xx<<yy<<endl;
           }
        }
//        for(i = 1;i<=n;i++)
//        {
//            if(i<xx||i>yy)
//            {
//                cout<<a[i];
//            }
//        }
//        cout<<endl;
    }
    return 0;
}

目前写到这里····等明天接着挑吧,额,2014年11月13日21:45:01了,要回去了,今天就到这吧····明天线段树了···

0 0