??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品免费看久久久香蕉,久久99热国产这有精品,久久亚洲美女精品国产精品http://m.shnenglu.com/mysileng/archive/2013/10/16/203776.html鑫龙鑫龙Wed, 16 Oct 2013 12:31:00 GMThttp://m.shnenglu.com/mysileng/archive/2013/10/16/203776.htmlhttp://m.shnenglu.com/mysileng/comments/203776.htmlhttp://m.shnenglu.com/mysileng/archive/2013/10/16/203776.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/203776.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/203776.html                                                     Dijkstra法Q单源最短\径)

      单源最短\径问题,卛_图中求出l定点到其它Q一点的最短\径。在弄清楚如何求单源最短\径问题之前,必须弄清楚最短\径的最优子l构性质?/p>

一.最短\径的最优子l构性质

   该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从点i到j的最短\径,k和s是这条\径上的一个中间顶点,那么P(k,s)必定是从k到s的最短\径。下面证明该性质的正性?/p>

   假设P(i,j)={Vi....Vk..Vs...Vj}是从点i到j的最短\径,则有P(i,j)=P(i,k)+P(k,s)+P(s,j)。而P(k,s)不是从k到s的最短距,那么必定存在另一条从k到s的最短\径P'(k,s)Q那么P'(i,j)=P(i,k)+P'(k,s)+P(s,j)<P(i,j)。则与P(i,j)是从i到j的最短\径相矛盾。因此该性质得证?/p>

?Dijkstra法

   ׃q性质可知Q如果存在一条从i到j的最短\?Vi.....Vk,Vj)QVk是Vj前面的一点。那?Vi...Vk)也必定是从i到k的最短\径。ؓ了求出最短\径,Dijkstra提Z以最短\径长度递增Q逐次生成最短\径的法。譬如对于源点V0Q首先选择其直接相ȝ点中长度最短的点ViQ那么当前已知可得从V0到达Vj点的最短距dist[j]=min{dist[j],dist[i]+matrix[i][j]}。根据这U思\Q?/p>

假设存在G=<V,E>Q源点为V0QU={V0},dist[i]记录V0到i的最短距,path[i]记录从V0到i路径上的i前面的一个顶炏V?/p>

1.从V-U中选择使dist[i]值最的点iQ将i加入到U中;

2.更新与i直接盔R点的dist倹{?dist[j]=min{dist[j],dist[i]+matrix[i][j]})

3.知道U=VQ停止?/p>

代码实现:

/*Dijkstra求单源最短\?nbsp;2010.8.26*/
 
#include <iostream>
#include<stack>
#define M 100
#define N 100
using namespace std;

typedef struct node
{
    int matrix[N][M];      //L矩阵 
    int n;                 //点?nbsp;
    int e;                 //Ҏ 
}MGraph; 

void DijkstraPath(MGraph g,int *dist,int *path,int v0)   //v0表示源顶?nbsp;
{
    int i,j,k;
    bool *visited=(bool *)malloc(sizeof(bool)*g.n);
    for(i=0;i<g.n;i++)     //初始?nbsp;
    {
        if(g.matrix[v0][i]>0&&i!=v0)
        {
            dist[i]=g.matrix[v0][i];
            path[i]=v0;     //path记录最短\径上从v0到i的前一个顶?nbsp;
        }
        else
        {
            dist[i]=INT_MAX;    //若i不与v0直接盔RQ则权值置为无I大 
            path[i]=-1;
        }
        visited[i]=false;
        path[v0]=v0;
        dist[v0]=0;
    }
    visited[v0]=true;
    for(i=1;i<g.n;i++)     //循环扩展n-1?nbsp;
    {
        int min=INT_MAX;
        int u;
        for(j=0;j<g.n;j++)    //L未被扩展的权值最的点 
        {
            if(visited[j]==false&&dist[j]<min)
            {
                min=dist[j];
                u=j;        
            }
        } 
        visited[u]=true;
        for(k=0;k<g.n;k++)   //更新dist数组的值和路径的?nbsp;
        {
            if(visited[k]==false&&g.matrix[u][k]>0&&min+g.matrix[u][k]<dist[k])
            {
                dist[k]=min+g.matrix[u][k];
                path[k]=u; 
            }
        }        
    }    
}

void showPath(int *path,int v,int v0)   //打印最短\径上的各个顶?nbsp;
{
    stack<int> s;
    int u=v;
    while(v!=v0)
    {
        s.push(v);
        v=path[v];
    }
    s.push(v);
    while(!s.empty())
    {
        cout<<s.top()<<" ";
        s.pop();
    }


int main(int argc, char *argv[])
{
    int n,e;     //表示输入的顶Ҏ和边?nbsp;
    while(cin>>n>>e&&e!=0)
    {
        int i,j;
        int s,t,w;      //表示存在一条边s->t,权gؓw
        MGraph g;
        int v0;
        int *dist=(int *)malloc(sizeof(int)*n);
        int *path=(int *)malloc(sizeof(int)*n);
        for(i=0;i<N;i++)
            for(j=0;j<M;j++)
                g.matrix[i][j]=0;
        g.n=n;
        g.e=e;
        for(i=0;i<e;i++)
        {
            cin>>s>>t>>w;
            g.matrix[s][t]=w;
        }
        cin>>v0;        //输入源顶?nbsp;
        DijkstraPath(g,dist,path,v0);
        for(i=0;i<n;i++)
        {
            if(i!=v0)
            {
                showPath(path,i,v0);
                cout<<dist[i]<<endl;
            }
        }
    }
    return 0;
}






鑫龙 2013-10-16 20:31 发表评论
]]>
逆序数及其求?/title><link>http://m.shnenglu.com/mysileng/archive/2013/09/20/203315.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Fri, 20 Sep 2013 09:23:00 GMT</pubDate><guid>http://m.shnenglu.com/mysileng/archive/2013/09/20/203315.html</guid><wfw:comment>http://m.shnenglu.com/mysileng/comments/203315.html</wfw:comment><comments>http://m.shnenglu.com/mysileng/archive/2013/09/20/203315.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/mysileng/comments/commentRss/203315.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/mysileng/services/trackbacks/203315.html</trackback:ping><description><![CDATA[<p style="color: #7b7d62; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 12px; line-height: 17.600000381469727px;">1. 逆序?/p><p style="color: #7b7d62; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 12px; line-height: 17.600000381469727px;">所谓逆序敎ͼ是指一个序列S[i]Q统计处于序列的每个数的比这个数大ƈ且排在它前面的数的数目,然后对于所有数Q把q个数目加v来求和就是了?br />比如 4 3 1 2<br />4W一个,所以数目ؓ0<br />3的前面是4Q大?的数目ؓ1<br />1的前面是4 3 Q大?的数目ؓ2<br />2的前面是4 3 1Q大?的数目ؓ2<br />所以逆序Cؓ1+2+2 = 5</p><p style="color: #7b7d62; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 12px; line-height: 17.600000381469727px;">求逆序数的两种Ҏ<br />常规Ҏ是按照逆序数的规则做,l果复杂度是O(n*n)Q一般来_有两U快速的求逆序数的Ҏ<br />分别是归q排序和树状数组?/p><p style="color: #7b7d62; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 12px; line-height: 17.600000381469727px;"><br />2. 归ƈ排序 <br />归ƈ排序是源于分而治之思想Q详l的q程可以查阅其他资料QM思想是划分一半,各自排好序后两个有序序列合qv来?/p><p style="color: #7b7d62; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 12px; line-height: 17.600000381469727px;">如何修改归ƈ排序求逆序?<br />首先我们假设两个有序序列 a[i]和b[i]Q当合ƈӞ<br />׃a[i]已是有序Q所以对于a[i]的各个元素来_排在它前面且比它大的数目都是0<br />当b[i]中含有比a[i]的元素Ӟ我们必然b[i]元素插到前面Q那么就是说Q在b[i]原先位置到该插的位置中,所有数都比b[i]大且排在它前?br />所以这是b[i]的数目ؓ新插入位|newPos - 原来位置oldPos</p><p style="color: #7b7d62; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 12px; line-height: 17.600000381469727px;">那么对于一半的序列又怎么做呢Q我们知道,归ƈ排序会l向下递归Q而递归完成q回后将是两l有序的序列Qƈ且拿到局部的逆序敎ͼ<br />所以在Merge函数中添加这一计数操作卛_<br /></p><p style="color: #7b7d62; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 12px; line-height: 17.600000381469727px;"> </p><span style="color: #7b7d62; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 12px; line-height: 17.600000381469727px; background-color: #ffffff;">代码CZ如下Q?br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">int</span> L[M];<br /><span style="color: #0000FF; ">int</span> R[M];<br /><br /><span style="color: #0000FF; ">const</span> <span style="color: #0000FF; ">int</span> Max = 1 <<30;<br />__int64 change = 0;<br /><br /><span style="color: #0000FF; ">void</span> Merge(<span style="color: #0000FF; ">int</span> *data,<span style="color: #0000FF; ">int</span> left,<span style="color: #0000FF; ">int</span> divide,<span style="color: #0000FF; ">int</span> right)<br />{<br />    <span style="color: #0000FF; ">int</span> lengthL = divide - left;<br />    <span style="color: #0000FF; ">int</span> lengthR = right - divide;<br />    <br />    <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> i = 0; i < lengthL; ++i)<br />    {<br />        L[i] = data[left + i];<br />    }<br />    <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> i = 0; i < lengthR; ++i)<br />    {<br />        R[i] = data[divide + i];<br />    }<br />    L[lengthL] = R[lengthR] = Max;<br />    <span style="color: #0000FF; ">int</span> i = 0;<br />    <span style="color: #0000FF; ">int</span> j = 0;<br />    <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> k = left; k < right; ++k)<br />    {<br />        <span style="color: #0000FF; ">if</span>(L[i] <= R[j])<br />        {<br />            data[k] = L[i];<br />            ++i;<br />        }<br />        <span style="color: #0000FF; ">else</span> <br />        {<br />            change += divide - i - left ;<br />            data[k] = R[j];<br />            ++j;<br />        }<br />    }<br /><br />}<br /><br /><span style="color: #0000FF; ">void</span> MergeSort(<span style="color: #0000FF; ">int</span> *data,<span style="color: #0000FF; ">int</span> left,<span style="color: #0000FF; ">int</span> right)<br />{<br />    <span style="color: #0000FF; ">if</span>(left < right -1)<br />    {<br />        <span style="color: #0000FF; ">int</span> divide = (left + right)/2;<br />        MergeSort(data,left,divide);<br />        MergeSort(data,divide,right);<br />        Merge(data,left,divide,right);<br />    }<br />}</div><span style="color: #7b7d62; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 12px; line-height: 17.600000381469727px; background-color: #ffffff;"><br /></span><p style="color: #7b7d62; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 12px; line-height: 17.600000381469727px;">3. 树状数组<br />求逆序数的另外一U方法是使用树状数组<br />对于数据,可以直接插入树状数组Q对于大数据Q则需要离散化Q所谓离散化Q就是将<br />100 200 300 400 500 ---> 1 2 3 4 5</p><p style="color: #7b7d62; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 12px; line-height: 17.600000381469727px;">q里主要利用树状数组解决计数问题?/p><p style="color: #7b7d62; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 12px; line-height: 17.600000381469727px;">首先按顺序把序列a[i]每个数插入到树状数组中,插入的内Ҏ1Q表C放了一个数到树状数l中?br />然后使用sum操作获取当前比a[i]的敎ͼ那么当前i - sum则表C当前比a[i]大的敎ͼ如此反复直到所有数都统计完Q?br />比如<br />4 3 1 2 <br />i = 1 : 插入 4 : update(4,1)Qsum(4)q回1Q那么当前比4大的?i - 1 = 0;<br />i = 2 : 插入 3 : update(3,1)Qsum(3)q回1Q那么当前比3大的?i - 1 = 1;<br />i = 3 : 插入 1 : update(1,1)Qsum(1)q回1Q那么当前比1大的?i - 1 = 2;<br />i = 4 : 插入 2 : update(2,1)Qsum(2)q回2Q那么当前比2大的?i - 2 = 2;</p><p style="color: #7b7d62; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 12px; line-height: 17.600000381469727px;">q程很明了,所以逆序Cؓ1+2+2=5<br /><br />代码CZ如下Q?/p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">树状数组</span><span style="color: #008000; "><br /></span>__int64 sums[1005];<br /><span style="color: #0000FF; ">int</span> len;<br /><br />inline <span style="color: #0000FF; ">int</span> lowbit(<span style="color: #0000FF; ">int</span> t)<br />{<br />    <span style="color: #0000FF; ">return</span> t & (t^(t-1)); <br />}<br /><br /><span style="color: #0000FF; ">void</span> update(<span style="color: #0000FF; ">int</span> _x,<span style="color: #0000FF; ">int</span> _value)<br />{<br />    <span style="color: #0000FF; ">while</span>(_x <= len)<br />    {<br />        sums[_x] += _value;<br />        _x += lowbit(_x);<br />    }<br />}<br /><br />__int64 sum(<span style="color: #0000FF; ">int</span> _end)<span style="color: #008000; ">//</span><span style="color: #008000; ">get sum[1_end]</span><span style="color: #008000; "><br /></span>{<br />    __int64 ret = 0;<br />    <span style="color: #0000FF; ">while</span>(_end > 0)<br />    {<br />        ret += sums[_end];<br />        _end -= lowbit(_end);<br />    }<br />    <span style="color: #0000FF; ">return</span> ret;<br />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">求逆序?/span><span style="color: #008000; "><br /></span><br />__int64 ret = 0;<br /><span style="color: #0000FF; ">for</span> (__int64 i = 0; i < k; ++i)<br />{<br />    update(a[i],1);<br />    ret += (i+1) - sum(a[i]);<br />}</div><span style="color: #7b7d62; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 12px; line-height: 17.600000381469727px; background-color: #ffffff;"><br /><br /><br /><br /><br /></span><img src ="http://m.shnenglu.com/mysileng/aggbug/203315.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/mysileng/" target="_blank">鑫龙</a> 2013-09-20 17:23 <a href="http://m.shnenglu.com/mysileng/archive/2013/09/20/203315.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mq制转换为nq制-Lq制转换法http://m.shnenglu.com/mysileng/archive/2013/06/08/200879.html鑫龙鑫龙Sat, 08 Jun 2013 08:16:00 GMThttp://m.shnenglu.com/mysileng/archive/2013/06/08/200879.htmlhttp://m.shnenglu.com/mysileng/comments/200879.htmlhttp://m.shnenglu.com/mysileng/archive/2013/06/08/200879.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/200879.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/200879.html转自:http://www.cnblogs.com/pkuoliver/archive/2010/10/27/Convert-m-number-to-n-number.html

园子里有很多p不漏的高手,在这里聊q种基本问题是有点小儿科。不q本人只是想分n下自q新的Q代码,法有不之处,q请大家指正Q共同进步?/p>

 

q种题也是一道经典的面试题,主要考察q制转换l想QCoding质量{?/p>

当我们把十进制{成二q制的时候,我们通过辗{盔RQ取余,逆置余数序列的过E得到新的进制的数。因此我们可以借助q种思想把Mq制转成Nq制的数?/p>

如下是C的详l的实现Ҏ

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void m2n(int m, char* mNum, int n, char* nNum) 
{
    int i = 0;
    char c, *p = nNum;
  
    //q是一个考察地方Q是否能用最乘法次数?
    while (*mNum != '\0')
        i = i*m + *mNum++ - '0';
      
    //辗{取余
    while (i) {
        *p++ = i % n + '0';
        i /= n;
    }
    *p-- = '\0';
  
    //逆置余数序列
    while (p > nNum) {
        c = *p;
        *p-- = *nNum;
        *nNum++ = c;
    }
}

观察上面的代码,存在着众多的不뀂例如,要对输入参数做检查,数值的大小收到int值最大值的限制{。不q好在一点,该算法的旉复杂度是O(n)的?/p>

 

我们霚w无敌的n大叔又提供了一U用Java实现的通用的进制{换方法,即Windows的计器也{不了的大敎ͼq个法也可以{。算和上面的法相比Q他的基本思想不变Q还是辗转除Q但是用了字W串做大数相除,很不错的创新点,赞一个。代码如下:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package test;
  
/**
 * 功能Q将一个数从Mq制转换成Nq制
 * MValueQMq制数的字符串表C方?
 * ShangQ保存中间运结?
 * MQMq制
 * NQNq制
 */
public class M2N {
    // 在这里对输入赋?
    public static String MValue = "1231412423534674574757";
    public static String Shang = null;
    public static int M = 10;
    public static int N = 8;
  
    public static void main(String[] args) {
        String nValue = "";
        Shang = MValue;
        while(Shang.length() > 0) {
            nValue = qiuyu(Shang) + nValue;
        }
        System.out.println(nValue);
    }
  
    /**
     * 功能Q对l定的Mq制字符串对n求余?
     
     * @param MTempValue
     * @param m
     * @param n
     * @return
     */
    public static String qiuyu(String MTempValue) {
        Shang = "";
        int temp = 0;
        while (MTempValue.length() > 0) {
            int t = getIntFromStr(MTempValue.substring(0, 1));
            MTempValue = MTempValue.substring(1);
            temp = temp * M + t;
            Shang += getStrFromInt(temp / N);
            temp = temp % N;
        }
        while(Shang.length() > 0 && Shang.charAt(0) == '0'){
            Shang = Shang.substring(1);
        }
        return getStrFromInt(temp);
    }
  
    public static int getIntFromStr(String str){
        return str.charAt(0) <= '9' && str.charAt(0) >= '0'
            str.charAt(0) - '0' : str.charAt(0) - 'a' + 10;
    }
  
    public static String getStrFromInt(int value){
        String result = null;
        if(value>=0 && value<=9)
            result = String.valueOf((char)('0' + value));
        else if(vlaue > 9 && value <36)
        {
            result = String.valueOf((char)('a' + value - 10));
        }
        else
        {
            result = "-1";// 出错误了
        }
        return result;
    }
}

赵大叔的法好了不少Q除了参数检查,大小写之外都很好。值得我们借鉴?nbsp;



鑫龙 2013-06-08 16:16 发表评论
]]>
求图两点之间所有\?/title><link>http://m.shnenglu.com/mysileng/archive/2013/06/07/200845.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Fri, 07 Jun 2013 08:47:00 GMT</pubDate><guid>http://m.shnenglu.com/mysileng/archive/2013/06/07/200845.html</guid><wfw:comment>http://m.shnenglu.com/mysileng/comments/200845.html</wfw:comment><comments>http://m.shnenglu.com/mysileng/archive/2013/06/07/200845.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/mysileng/comments/commentRss/200845.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/mysileng/services/trackbacks/200845.html</trackback:ping><description><![CDATA[<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><br />求两定点之间的全部\径,其根本是一个涉及到搜烦和回溯的问题。我们设计算法时所兛_的首要问题是Q按照何U顺序搜索和回溯才能保证路径可以不重不漏地被全部扑ֈ?br /> </span></p><p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">囄存储l构Q邻接矩c?font face="Calibri">Arcs</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span></p><p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">工作l构Q结Ҏ <font face="Calibri">mystack;</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span></p><p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">状态保存结构: </span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span></p><p class="p15" style="margin-left:36.0000pt; text-indent:-36.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Calibri'; ">Q?Q?nbsp;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">VertexStatus[]={0,0,0,1,1,</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Calibri'; ">…</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">}<font face="宋体">。当l点未进栈或者已l出栈,则其对应的状态ؓ</font><font face="Calibri">0</font><font face="宋体">Q否则状态ؓ</font><font face="Calibri">1</font><font face="宋体">Q?/font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span></p><p class="p15" style="margin-left:36.0000pt; text-indent:-36.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Calibri'; ">Q?Q?nbsp;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">ArcStatus[][]={0,0,1,0,1</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Calibri'; ">…</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">..}<font face="宋体">当且仅当边的两个l点都在栈外Ӟ边的状态才?/font><font face="Calibri">0</font><font face="宋体">Q否则ؓ</font><font face="Calibri">1</font><font face="宋体">?/font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span></p><p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">注意我们只所以设计如上结炏V边两个状态存储结构,是依据?font face="Calibri">path</font><font face="宋体">的定义,l点不重复,边不重复。具有边状态存储结构,也是我的法与其他算法根本上的不同?/font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span></p><p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">不失一般性,我们假设原点的编hؓ<font face="Calibri">0,</font><font face="宋体">目标点的~号最?/font><font face="Calibri">N</font><font face="宋体">。我们的问题转换成了Q求最编L节点与最大编L节点之间的所有\径?br /><br /></font></span></p><p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Calibri'; ">P</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">aths={}//<font face="宋体">路径集合</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span></p><p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">VertexStatus[]={0};//<font face="宋体">全部|?/font><font face="Calibri">0</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span></p><p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">ArcStatus[][]={0};////<font face="宋体">全部|?/font><font face="Calibri">0</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span></p><p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Calibri'; ">mystack</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">.push(0);</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span></p><p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">VertexStatus[0]=1;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span></p><p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Calibri'; ">W</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">hile(!mystack.empty())</span><span style="font-family: 宋体; font-size: 10.5pt;">{</span></p><p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Calibri'; ">  I</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">nt elem= mystack.top();//<font face="宋体">获得栈顶元素</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span></p><p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">  if(elem==N)</span><span style="font-family: 宋体; font-size: 10.5pt; text-indent: 21pt;">{</span><span style="font-family: 宋体;">//</span><font face="宋体" style="font-family: 宋体;">扑ֈ了一条\?/font></p><p class="p0" style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "> </span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Calibri'; ">path</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">=Traverse(mystack);</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span></p><p class="p0" style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "> </span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">Paths.add(path);</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span></p><p class="p0" style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "> </span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">VertexStatus[elem]=0;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span></p><p class="p0" style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "> </span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">UpdateArcStatus();//<font face="宋体">更新</font><font face="Calibri">ArcStatus[][]</font><font face="宋体">Q得所有两个端炚w不在栈内的边的状态ؓ</font><font face="Calibri">0</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span></p><p class="p0" style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "> </span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Calibri'; ">mystack</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">.pop();//<font face="宋体">U除栈顶元素<br /></font></span><span style="font-family: 宋体; font-size: 10.5pt; text-indent: 21pt;">  }</span><span style="font-family: Calibri; font-size: 10.5pt; text-indent: 21pt;">else</span><span style="font-family: 宋体; font-size: 10.5pt; text-indent: 21pt;">{</span></p><p class="p0" style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "> </span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Calibri'; ">i</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">=0;<br /></span><span style="text-indent: 21pt; font-size: 10.5pt; font-family: Calibri;">          F</span><span style="text-indent: 21pt; font-size: 10.5pt; font-family: 宋体;">or(;i<N;i++)</span><span style="font-family: 宋体; font-size: 10.5pt; text-indent: 21pt;">{ <br />      if(VertexStatus[i]=0&&ArcStatus[elem][i]=0&&Arcs.contain(elem,i))</span><span style="font-family: 宋体; font-size: 10.5pt; text-indent: 21pt;">{</span></p><p class="p0" style="margin-left:21.0000pt; text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "> </span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "> </span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">VertexStatus[i]=1;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span></p><p class="p0" style="margin-left:21.0000pt; text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "> </span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "> </span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">ArcStatus[elem][i]=1;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span></p><p class="p0" style="margin-left:21.0000pt; text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "> </span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "> </span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Calibri'; ">M</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">ystack.push(i);//<font face="宋体">入栈<br /></font></span><span style="font-family: 宋体; font-size: 10.5pt; text-indent: 21pt;">    break;<br /></span><span style="font-family: 宋体; font-size: 10.5pt; text-indent: 21pt;">  }<br /></span><span style="font-family: 宋体; font-size: 10.5pt; text-indent: 21pt;">}<br /></span><span style="text-indent: 21pt; font-size: 10.5pt; font-family: Calibri;">if</span><span style="text-indent: 21pt; font-size: 10.5pt; font-family: 宋体;">(i=N)</span><span style="font-family: 宋体; font-size: 10.5pt; text-indent: 21pt;">{</span><span style="font-family: 宋体;">//</span><font face="宋体" style="font-family: 宋体;">该节Ҏ有符合要求的后箋节点</font></p><p class="p0" style="margin-left:21.0000pt; text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">VertexStatus[elem]=0;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span></p><p class="p0" style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">    UpdateArcStaus();////<font face="宋体">更新</font><font face="Calibri">ArcStatus[][]</font><font face="宋体">Q得所有两个端炚w不在栈内的边的状?/font><font face="Calibri">0</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span></p><p class="p0" style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Calibri'; ">          M</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">ystack.pop();//<font face="宋体">出栈<br /></font></span><span style="font-family: 宋体; font-size: 10.5pt; text-indent: 21pt;">    }<br /></span><span style="font-family: 宋体; font-size: 10.5pt; text-indent: 21pt;">   }<br /></span><span style="font-family: 宋体; font-size: 10.5pt; text-indent: 21pt;">}</span></p><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><font face="宋体"><br /></font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><o:p></o:p></span><p> </p><p> </p><img src ="http://m.shnenglu.com/mysileng/aggbug/200845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/mysileng/" target="_blank">鑫龙</a> 2013-06-07 16:47 <a href="http://m.shnenglu.com/mysileng/archive/2013/06/07/200845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>q制数模?/title><link>http://m.shnenglu.com/mysileng/archive/2013/06/06/200832.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Thu, 06 Jun 2013 13:57:00 GMT</pubDate><guid>http://m.shnenglu.com/mysileng/archive/2013/06/06/200832.html</guid><wfw:comment>http://m.shnenglu.com/mysileng/comments/200832.html</wfw:comment><comments>http://m.shnenglu.com/mysileng/archive/2013/06/06/200832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/mysileng/comments/commentRss/200832.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/mysileng/services/trackbacks/200832.html</trackback:ping><description><![CDATA[<div>考虑n位二q制敎ͼ有多个C不存在两个相ȝ1。例如,3位数中有5个数W合q一要求Q?00?01?10?00?01?nbsp;</div><div>1、试扑և其中的规?nbsp;</div><div>2、请l出完整代码实现Q参数输入代码可略) </div><div>3、试证明你找到的规律是正的 </div><div>1?{:规律? n/2+2n-n/2-1?nbsp;</div><div>2?代码如下 </div><div>#include<cmath> </div><div>using namespace std; </div><div>int Func(int n) { </div><div>  if(n<0) {  return -1; } </div><div>  if(n==0) {  return 0; } </div><div>  return pow(2,(n/2))+pow(2,((n-(n/2)))-1;</div><div>} </div><div> </div><div>3?证明Q构造法Q?nbsp;</div><div>{: </div><div>1列出n位由1l成?q制数aQ?11。。。?11Q?/div><div>2奇数位都?取代得到数bQ?10。。。?10Q?nbsp;</div><div>3偶数位也?取代得到数cQ?01。。。?01Q?nbsp;</div><div>4数b和数c中的M一?都可以被0取代Q或不被取代Q而构造出满要求的数Q且每个1的取代具有独立性?nbsp;</div><div>5数b可以构造出2n/2个满求的敎ͼ同时数c可以构造出2n-n/2个满求的数?nbsp;</div><div>6数b和数a都可以构造出全由0l成二进制数Q因此统计存在一个重复?nbsp;</div><div>7规律? n/2+2n-n/2-1Q?br /><br />-------------------------------------------------------------------------------------------------<br /><span style="color: #333333; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 24px; background-color: #f5f5f5;">n位的二进?比如3?000 001 010 100 101</span><br style="color: #333333; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 24px; background-color: #f5f5f5;" /><span style="color: #333333; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 24px; background-color: #f5f5f5;">什么规律呢Q假设n位二q制有f(n)U不盔R的组合,</span><br style="color: #333333; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 24px; background-color: #f5f5f5;" /><span style="color: #333333; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 24px; background-color: #f5f5f5;">从最左边的位|开始放Q可以放0Q也可以??/span><br style="color: #333333; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 24px; background-color: #f5f5f5;" /><span style="color: #333333; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 24px; background-color: #f5f5f5;">如果最左边?Q那么将不媄响第二位的放|,从第二位放vQ即有f(n-1)U?/span><br style="color: #333333; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 24px; background-color: #f5f5f5;" /><span style="color: #333333; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 24px; background-color: #f5f5f5;">如果最左边?Q那么第二位则只能放0Q从W三位放Pxf(n-2)U?/span><br style="color: #333333; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 24px; background-color: #f5f5f5;" /><span style="color: #333333; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 24px; background-color: #f5f5f5;">所以f(n)=f(n-1)+f(n-2)U?/span><br style="color: #333333; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 24px; background-color: #f5f5f5;" /><span style="color: #333333; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 24px; background-color: #f5f5f5;">另外f(1)=2(因ؓ可以?或?),f(2)=3(因ؓ可以?0,01,10)?/span><br /><br /><br /><br /><br /></div><img src ="http://m.shnenglu.com/mysileng/aggbug/200832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/mysileng/" target="_blank">鑫龙</a> 2013-06-06 21:57 <a href="http://m.shnenglu.com/mysileng/archive/2013/06/06/200832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>囄一个题http://m.shnenglu.com/mysileng/archive/2013/05/26/200596.html鑫龙鑫龙Sun, 26 May 2013 02:40:00 GMThttp://m.shnenglu.com/mysileng/archive/2013/05/26/200596.htmlhttp://m.shnenglu.com/mysileng/comments/200596.htmlhttp://m.shnenglu.com/mysileng/archive/2013/05/26/200596.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/200596.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/200596.html题目Q一个单入口单出口的有向无环图中Q要求在某些地方插入一些节点得Q何一条由L到终Ҏl历的节Ҏ相同Q类g下面的图Q要求给出算法描qƈ分析旉复杂度?br />
如上图所C,节点A到C有两条\径,ABCq条路径l过了一个节点,而AC路径l过?个节点,我们的算法所要做的事是要在AC路径中间加入一个节点,然后ABC路径和ADC路径都经q了一个节炏V?br />
法是这LQ对于每个节点维护一l信息,包括节点的层敎ͼ起始节点到该节点的\径长度,起始节点设ؓ0Q以及生成该长度的父节点Q相对于叛_Q节?l护的不l处理的信息是Q层?来自节点3和节?Q节?l护的不l处理的信息是Q层?来自节点5和节?以及层数2来自节点4Q节?的不l处理的信息是:层数4来自节点7Q层?来自节点7Q层?来自节点4。我们算法所要做的事是最l每个节点需要维护的层信息变Z个,xZ那条路径到该节点Q该节点所处的层数都是固定的。算法如下:
1、初始化起始节点的层C?/span>
2、从起始节点开始遍历每条\径,遇到每个节点生成一个维护信?/span>
Q?Q如果此节点不存在维护信息,创徏之;
Q?Q如果该节点存在l护信息Q有两种情况Q?/span>
QaQ如果生成的l护信息的层数和原来已有的维护信息的层数是相同的Q则合ƈq两个维护信息,比如对于例子中的图,节点5原来的维护信息ؓ“层数3来自节点2”Q然后从节点3到节?生成的维护信息ؓ“层数3来自节点3”Q由于层数相同,我们可以其合ƈ?#8220;层数3来自节点2和节?”Q?/span>
QbQ如果生成的l护信息的层数和原来节点的维护信息的层数不一_我们需要比较那一个的层数较大Q?/span>
a.如果原来l护信息的层数较大,此时Q我们只需要在生成此维护信息的节点与此节点之间插入一个新的节点,然后生成新节点的l护信息Q然后从新节点开始(2Q过E?/span>
b.如果新生成的l护信息的层数较大,新生成的节点信息存入此节点Q然后我们需要在生成原来l护信息的所有节点和此节点之间插入新节点Qƈ且需要从所有的新插入节点开始(2Q过E?br />




鑫龙 2013-05-26 10:40 发表评论
]]>
已知一个函数rand7()能够生成1-7的随机数Q请l出一个函数rand10()Q该函数能够生成1-10的随机数?/title><link>http://m.shnenglu.com/mysileng/archive/2013/05/20/200426.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Mon, 20 May 2013 14:55:00 GMT</pubDate><guid>http://m.shnenglu.com/mysileng/archive/2013/05/20/200426.html</guid><wfw:comment>http://m.shnenglu.com/mysileng/comments/200426.html</wfw:comment><comments>http://m.shnenglu.com/mysileng/archive/2013/05/20/200426.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/mysileng/comments/commentRss/200426.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/mysileng/services/trackbacks/200426.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><strong>题目Q?/strong></p><p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;">已知一个函数rand7()能够生成1-7的随机数Q请l出一个函敎ͼ该函数能够生?-10的随机数?/p><p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><br /></p><p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><strong>思\Q?/strong></p><p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;">假如已知一个函数能够生?-49的随机数Q那么如何以此生?-10的随机数呢?</p><p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><br /></p><p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><strong>解法Q?/strong></p><p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;">该解法基于一U叫做拒l采LҎ。主要思想是只要生一个目标范围内的随机数Q则直接q回。如果生的随机C在目标范围内Q则丢弃该|重新取样。由于目标范围内的数字被选中的概率相{,q样一个均匀的分布生成了?/p><p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;">昄rand7臛_需要执?ơ,否则产生不了1-10的数字。通过q行rand7两次Q可以生?-49的整敎ͼ</p><p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"></p><pre name="code" style="white-space: pre-wrap; word-wrap: break-word; margin-top: 0px; margin-bottom: 24px; padding: 10px; border: 1px solid #cccccc; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: #fff7f0; overflow: auto; width: 262.3999938964844px; line-height: 20.799999237060547px; color: #222222;"><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: transparent;"> 1 2 3 4 5 6 7 1</span> <span style="color: maroon; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: transparent;">1 2 3 4 5 6 7</span> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: transparent;">2</span> <span style="color: maroon; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: transparent;">8 9 10 1 2 3 4</span> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: transparent;">3</span> <span style="color: maroon; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: transparent;">5 6 7 8 9 10 1</span> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: transparent;">4</span> <span style="color: maroon; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: transparent;">2 3 4 5 6 7 8</span> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: transparent;">5</span> <span style="color: maroon; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: transparent;">9 10 1 2 3 4 5</span> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: transparent;">6</span> <span style="color: maroon; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: transparent;">6 7 8 9 10 * *</span> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: transparent;">7</span> <span style="color: maroon; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: transparent;">* * * * * * *</span></pre><strong style="font-family: Arial; font-size: 14px; line-height: 26px;">׃49不是10的倍数Q所以我们需要丢弃一些|我们惌的数字范围ؓ1-40Q不在此范围则丢弃ƈ重新取样?/strong><p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"></p><p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><strong>代码Q?/strong></p><p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"></p><div bg_cpp"="" style="width: 1355.300048828125px; line-height: 26px;"><div><div><strong>[cpp]</strong> <a title="view plain" style="background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_plain.gif); padding: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-position: 0% 0%; background-repeat: no-repeat no-repeat;">view plain</a><a title="copy" style="background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_copy.gif); padding: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-position: 0% 0%; background-repeat: no-repeat no-repeat;">copy</a><div style="position: absolute; left: 377px; top: 942px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_1" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=18&height=18" wmode="transparent"></div></div></div><ol start="1"><li style="line-height: 18px;"><span style="color: #2e8b57; font-weight: bold;">int</span> rand10() {  </li><li style="line-height: 18px;">  <span style="color: #2e8b57; font-weight: bold;">int</span> row, col, idx;  </li><li style="line-height: 18px;">  do {  </li><li style="line-height: 18px;">    row = rand7();  </li><li style="line-height: 18px;">    col = rand7();  </li><li style="line-height: 18px;">    idx = col + (row-1)*7;  </li><li style="line-height: 18px;">  } while (idx > 40);  </li><li style="line-height: 18px;">  return 1 + (idx-1)%10;  </li><li style="line-height: 18px;">}  </li></ol></div><br style="font-family: Arial; font-size: 14px; line-height: 26px;" /><span style="font-family: Arial; font-size: 14px; line-height: 26px;">׃row范围?-7Qcol范围?-7Q这样idxD围ؓ1-49。大?0的D丢弃Q这样剩?-40范围内的数字Q通过取模q回。下面计一下得C个满?-40范围的数需要进行取Lơ数的期望|</span><p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"></p><p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"></p><pre style="white-space: pre-wrap; word-wrap: break-word; margin-top: 0px; margin-bottom: 24px; padding: 10px; border: 1px solid #cccccc; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: #fff7f0; overflow: auto; line-height: 20.799999237060547px; color: #222222;"><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: transparent;">E(# calls to rand7)</span> = 2 * (40/49) + 4 * (9/49) * (40/49) + 6 * (9/49)<sup style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 10px; background-color: transparent; bottom: 1ex; height: 0px; line-height: 1; position: static;">2</sup> * (40/49) + ... <span style="font-size: 10px; margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent;"><sub style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 10px; background-color: transparent; top: 0.5ex; height: 0px; line-height: 1; position: static;">∞</sub></span> = <span style="font-size: 18px; margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent;"><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 11.199999809265137px; vertical-align: baseline; background-color: transparent;">∑</span></span> 2k * (9/49)<sup style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 10px; background-color: transparent; bottom: 1ex; height: 0px; line-height: 1; position: static;">k-1</sup> * (40/49) <span style="font-size: 10px; margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent;">k=1</span> = (80/49) / (1 - 9/49)<sup style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 10px; background-color: transparent; bottom: 1ex; height: 0px; line-height: 1; position: static;">2</sup> = <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: transparent;">2.45</span></pre><strong style="font-family: Arial; font-size: 14px; line-height: 26px;">优化Q?/strong><p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"></p><p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;">上面的方法大概需?.45ơ调用rand7函数才能得到1?-10范围的数Q下面可以进行再度优化?/p><p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;">对于大于40的数Q我们不必马上丢弃,可以?1-49的数减去40可得?-9的随机数Q而rand7可生?-7的随机数Q这样可以生?-63的随机数。对?-60我们可以直接q回Q?1-63则丢弃,q样需要丢弃的数只?个,相比前面?个,效率有所提高。而对?1-63的数Q减?0后ؓ1-3Qrand7产生1-7Q这样可以再度利用?-21的数Q对?-20我们则直接返回,对于21则丢弃。这Ӟ丢弃的数只?个了Q优化又q一步。当然这里面对rand7的调用次C是增加了的。代码如下:</p><p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"></p><div bg_cpp"="" style="width: 1355.300048828125px; line-height: 26px;"><div><div><strong>[cpp]</strong> <a title="view plain" style="background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_plain.gif); padding: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-position: 0% 0%; background-repeat: no-repeat no-repeat;">view plain</a><a title="copy" style="background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_copy.gif); padding: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-position: 0% 0%; background-repeat: no-repeat no-repeat;">copy</a><div style="position: absolute; left: 377px; top: 1624px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_2" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=18&height=18" wmode="transparent"></div></div></div><ol start="1"><li style="line-height: 18px;"><span style="color: #2e8b57; font-weight: bold;">int</span> rand10Imp() {  </li><li style="line-height: 18px;">  <span style="color: #2e8b57; font-weight: bold;">int</span> a, b, idx;  </li><li style="line-height: 18px;">  while (true) {  </li><li style="line-height: 18px;">    a = rand7();  </li><li style="line-height: 18px;">    b = rand7();  </li><li style="line-height: 18px;">    idx = b + (a-1)*7;  </li><li style="line-height: 18px;">    if (idx <= 40)  </li><li style="line-height: 18px;">      return 1 + (idx-1)%10;  </li><li style="line-height: 18px;">    a = idx-40;  </li><li style="line-height: 18px;">    b = rand7();  </li><li style="line-height: 18px;">    // get uniform dist from 1 - 63  </li><li style="line-height: 18px;">    idx = b + (a-1)*7;  </li><li style="line-height: 18px;">    if (idx <= 60)  </li><li style="line-height: 18px;">      return 1 + (idx-1)%10;  </li><li style="line-height: 18px;">    a = idx-60;  </li><li style="line-height: 18px;">    b = rand7();  </li><li style="line-height: 18px;">    // get uniform dist from 1-21  </li><li style="line-height: 18px;">    idx = b + (a-1)*7;  </li><li style="line-height: 18px;">    if (idx <= 20)  </li><li style="line-height: 18px;">      return 1 + (idx-1)%10;  </li><li style="line-height: 18px;">  }  </li><li style="line-height: 18px;">}  </li></ol></div><span style="font-family: Arial; font-size: 14px; line-height: 26px;">下面计算下优化后Ҏ的调用rand7函数的期望次敎ͼ</span><p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"></p><p style="margin: 0px; padding: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"></p><pre style="white-space: pre-wrap; word-wrap: break-word; margin-top: 0px; margin-bottom: 24px; padding: 10px; border: 1px solid #cccccc; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: #fff7f0; overflow: auto; line-height: 20.799999237060547px; color: #222222;"><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: transparent;">E(# calls to rand7)</span> = 2 * (40/49) + 3 * (9/49) * (60/63) + 4 * (9/49) * (3/63) * (20/21) + (9/49) * (3/63) * (1/21) * [ 6 * (40/49) + 7 * (9/49) * (60/63) + 8 * (9/49) * (3/63) * (20/21) ] + ((9/49) * (3/63) * (1/21))<sup style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 10px; background-color: transparent; bottom: 1ex; height: 0px; line-height: 1; position: static;">2</sup> * [ 10 * (40/49) + 11 * (9/49) * (60/63) + 12 * (9/49) * (3/63) * (20/21) ] + ... = <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 12.800000190734863px; vertical-align: baseline; background-color: transparent;">2.2123</span></pre><span style="font-family: Arial; font-size: 14px; line-height: 26px;">q里期望ơ数?.21Q比h优化?.45ơ减了大概10%?/span><img src ="http://m.shnenglu.com/mysileng/aggbug/200426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/mysileng/" target="_blank">鑫龙</a> 2013-05-20 22:55 <a href="http://m.shnenglu.com/mysileng/archive/2013/05/20/200426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二叉树的非递归遍历http://m.shnenglu.com/mysileng/archive/2013/05/03/199948.html鑫龙鑫龙Fri, 03 May 2013 11:51:00 GMThttp://m.shnenglu.com/mysileng/archive/2013/05/03/199948.htmlhttp://m.shnenglu.com/mysileng/comments/199948.htmlhttp://m.shnenglu.com/mysileng/archive/2013/05/03/199948.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/199948.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/199948.html阅读全文

鑫龙 2013-05-03 19:51 发表评论
]]>
Skip ListQ蟩跃表Q原理详解与实现http://m.shnenglu.com/mysileng/archive/2013/04/06/199159.html鑫龙鑫龙Sat, 06 Apr 2013 11:55:00 GMThttp://m.shnenglu.com/mysileng/archive/2013/04/06/199159.htmlhttp://m.shnenglu.com/mysileng/comments/199159.htmlhttp://m.shnenglu.com/mysileng/archive/2013/04/06/199159.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/199159.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/199159.html阅读全文

鑫龙 2013-04-06 19:55 发表评论
]]>
最长上升子序列 O(nlogn)解法 (?http://m.shnenglu.com/mysileng/archive/2012/11/30/195841.html鑫龙鑫龙Fri, 30 Nov 2012 09:44:00 GMThttp://m.shnenglu.com/mysileng/archive/2012/11/30/195841.htmlhttp://m.shnenglu.com/mysileng/comments/195841.htmlhttp://m.shnenglu.com/mysileng/archive/2012/11/30/195841.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/195841.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/195841.html最q在做单调队列,发现了最长上升子序列O(nlogn)的求法也有利用单调队列的思想?/span>

    最镉K增子序列问题:在一列数中寻找一些数Q这些数满QQ意两个数a[i]和a[j]Q若i<jQ必有a[i]<a[j]Q这h长的子序列称为最镉K增子序列?/span>

   设dp[i]表示以i为结最镉K增子序列的长度Q则状态{ULEؓQ?/span>

dp[i] = max{dp[j]+1}, 1<=j<i,a[j]<a[i].

   q样单的复杂度ؓO(n^2)Q其实还有更好的Ҏ?/span>

   考虑两个数a[x]和a[y]Qx<y且a[x]<a[y],且dp[x]=dp[y]Q当a[t]要选择Ӟ到底取哪一个构成最优的呢?昄选取a[x]更有潜力Q因为可能存在a[x]<a[z]<a[y]Q这样a[t]可以获得更优的倹{在q里l我们一个启C,当dp[t]一hQ尽量选择更小的a[x].

    按dp[t]=k来分c,只需保留dp[t]=k的所有a[t]中的最|设d[k]记录q个|d[k]=min{a[t],dp[t]=k}?/span>

    q时注意到d的两个特点(重要Q:

1. d[k]在计过E中单调不升Q?nbsp;          

2. d数组是有序的Qd[1]<d[2]<..d[n]?/span>

    利用q两个性质Q可以很方便的求解:

1. 讑ֽ前已求出的最长上升子序列的长度ؓlenQ初始时?Q,每次d一个新元素xQ?/span>

2. 若x>d[len]Q则直接加入到d的末,且len++Q(利用性质2Q?/span>

   否则Q在d中二分查找,扑ֈW一个比x的数d[k]Qƈd[k+1]=xQ在q里x<=d[k+1]一定成立(性质1,2Q?/span>

 

  1. /** 
  2. 最镉K增子序列O(nlogn)法Q?/span> 
  3. 状态{ULE:f[i] = max{f[i],f[j]+1},1<=j<i,a[j]<a[i]. 
  4. 分析Q加入x<y,f[x]>=f[y],则x相对于y更有潜力?/span> 
  5. 首先Ҏf[]值分c,记录满f[t]=k的最的值a[t],记d[k]=min{a[t]},f[t]=k. 
  6.     1.发现d[k]在计过E中单调不上?/span> 
  7.     2.d[1]<d[2]<...<d[k] (反证) 1 2 3 8 4 7 
  8. 解法Q?/span> 
  9. 1. 讑ֽ前最镉K增子序列ؓlen,考虑元素a[i]; 
  10. 2. 若d[len]<a[i],则len++Qƈd[len]=a[i]; 
  11.    否则,在d[0-len]中二分查?扑ֈW一个比它小的元素d[k],qd[k+1]=a[i].() 
  12. */  
  13. #include <iostream>  
  14. #include <cstdio>  
  15. #include <cstring>  
  16. using namespace std;  
  17. const int N = 41000;  
  18. int a[N];       //a[i] 原始数据  
  19. int d[N];       //d[i] 长度为i的递增子序列的最?/span>  
  20.   
  21. int BinSearch(int key, int* d, int low, int high)  
  22. {  
  23.     while(low<=high)  
  24.     {  
  25.         int mid = (low+high)>>1;  
  26.         if(key>d[mid] && key<=d[mid+1])  
  27.             return mid;  
  28.         else if(key>d[mid])  
  29.             low = mid+1;  
  30.         else  
  31.             high = mid-1;  
  32.     }  
  33.     return 0;  
  34. }  
  35.   
  36. int LIS(int* a, int n, int* d)  
  37. {  
  38.     int i,j;  
  39.     d[1] = a[1];  
  40.     int len = 1;        //递增子序列长?/span>  
  41.     for(i = 2; i <= n; i++)  
  42.     {  
  43.         if(d[len]<a[i])  
  44.             j = ++len;  
  45.         else  
  46.             j = BinSearch(a[i],d,1,len) + 1;  
  47.         d[j] = a[i];  
  48.     }  
  49.     return len;  
  50. }  
  51.   
  52. int main()  
  53. {  
  54.     int t;  
  55.     int p;  
  56.     scanf("%d",&t);  
  57.     while(t--)  
  58.     {  
  59.         scanf("%d",&p);  
  60.         for(int i = 1; i <= p; i++)  
  61.             scanf("%d",&a[i]);  
  62.         printf("%d\n",LIS(a,p,d));  
  63.     }  
  64.     return 0;  
  65. }  

 



鑫龙 2012-11-30 17:44 发表评论
]]>
POJ题目分类(?http://m.shnenglu.com/mysileng/archive/2012/11/26/195696.html鑫龙鑫龙Mon, 26 Nov 2012 05:00:00 GMThttp://m.shnenglu.com/mysileng/archive/2012/11/26/195696.htmlhttp://m.shnenglu.com/mysileng/comments/195696.htmlhttp://m.shnenglu.com/mysileng/archive/2012/11/26/195696.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/195696.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/195696.html转脓 ACM的算法(觉得很好Q有层次感)
OJ上的一些水?可用来练手和增加自信) 
(poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094)


初期:

一.基本法: 
     (1)枚D. (poj1753,poj2965) 
     (2)贪心(poj1328,poj2109,poj2586) 
     (3)递归和分L. 
     (4)递推. 
     (5)构造法.(poj3295) 
     (6)模拟?(poj1068,poj2632,poj1573,poj2993,poj2996) 
?囄? 
     (1)囄深度优先遍历和广度优先遍? 
     (2)最短\径算?dijkstra,bellman-ford,floyd,heap+dijkstra) 
        (poj1860,poj3259,poj1062,poj2253,poj1125,poj2240) 
     (3)最生成树法(prim,kruskal) 
        (poj1789,poj2485,poj1258,poj3026) 
     (4)拓扑排序 (poj1094) 
     (5)二分囄最大匹?(匈牙利算? (poj3041,poj3020) 
     (6)最大流的增q\法(KM法). (poj1459,poj3436) 
?数据l构. 
     (1)?(poj1035,poj3080,poj1936) 
     (2)排序(快排、归q排(与逆序数有?、堆? (poj2388,poj2299) 
     (3)单ƈ查集的应? 
     (4)哈希表和二分查找{高效查找法(数的Hash,串的Hash)    
        (poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503) 
     (5)哈夫曼树(poj3253) 
     (6)?nbsp;
     (7)trie?静态徏树、动态徏? (poj2513) 
?单搜?nbsp;
     (1)深度优先搜烦 (poj2488,poj3083,poj3009,poj1321,poj2251) 
     (2)q度优先搜烦(poj3278,poj1426,poj3126,poj3087.poj3414) 
     (3)单搜索技巧和剪枝(poj2531,poj1416,poj2676,1129) 
?动态规?nbsp;
     (1)背包问题. (poj1837,poj1276) 
     (2)型如下表的简单DP(可参考lrj的书 page149): 
       1.E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533) 
       2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最长公共子序列) 
    
         (poj3176,poj1080,poj1159) 
       3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最优二分检索树问题) 
?数学 
     (1)l合数学: 
        1.加法原理和乘法原? 
        2.排列l合. 
        3.递推关系. 
          (POJ3252,poj1850,poj1019,poj1942) 
     (2)数论. 
        1.素数与整除问?nbsp;
        2.q制? 
        3.同余模运? 
          (poj2635, poj3292,poj1845,poj2115) 
     (3)计算Ҏ. 
        1.二分法求解单调函数相关知?(poj3273,poj3258,poj1905,poj3122) 
?计算几何? 
     (1)几何公式. 
     (2)叉积和点U的q用(如线D늛交的判定,点到U段的距ȝ). (poj2031,poj1039)

     (3)多边型的单算?求面U?和相兛_?点在多边型内,多边型是否相? 
         (poj1408,poj1584) 
     (4)凸包. (poj2187,poj1113)


中:

一.基本法: 
     (1)C++的标准模版库的应? (poj3096,poj3007) 
     (2)较ؓ复杂的模拟题的训l?poj3393,poj1472,poj3371,poj1027,poj2706) 
?囄? 
     (1)差分U束pȝ的徏立和求解. (poj1201,poj2983) 
     (2)最费用最大流(poj2516,poj2195) 
     (3)双连通分?poj2942) 
     (4)通分支及其羃?(poj2186) 
     (5)囄割边和割?poj3352) 
     (6)最割模型、网l流规约(poj3308, ) 
?数据l构. 
     (1)U段? (poj2528,poj2828,poj2777,poj2886,poj2750) 
     (2)静态二叉检索树. (poj2482,poj2352) 
     (3)树状树组(poj1195,poj3321) 
     (4)RMQ. (poj3264,poj3368) 
     (5)q查集的高应用. (poj1703,2492) 
     (6)KMP法. (poj1961,poj2406) 
?搜烦 
     (1)最优化剪枝和可行性剪?nbsp;
     (2)搜烦的技巧和优化 (poj3411,poj1724) 
     (3)记忆化搜?poj3373,poj1691) 
      
?动态规?nbsp;
     (1)较ؓ复杂的动态规?如动态规划解特别的施行商问题{? 
         (poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034) 
     (2)记录状态的动态规? (POJ3254,poj2411,poj1185) 
     (3)树型动态规?poj2057,poj1947,poj2486,poj3140) 
?数学 
     (1)l合数学: 
        1.Ҏ原理. 
        2.抽屉原理. 
        3.|换与Polya定理(poj1286,poj2409,poj3270,poj1026). 
        4.递推关系和母函数. 
         
     (2)数学. 
        1.高斯消元?poj2947,poj1487, poj2065,poj1166,poj1222) 
        2.概率问题. (poj3071,poj3440) 
        3.GCD、扩展的Ƨ几里d(中国剩余定理) (poj3101) 
     (3)计算Ҏ. 
        1.0/1分数规划. (poj2976) 
        2.三分法求解单?单谷)的极? 
        3.矩阵?poj3150,poj3422,poj3070) 
        4.q代D(poj3301) 
     (4)随机化算?poj3318,poj2454) 
     (5)杂题. 
         (poj1870,poj3296,poj3286,poj1095) 
?计算几何? 
        (1)坐标L? 
        (2)扫描U算?例如求矩形的面积和周长ƈ,常和U段树或堆一起?. 
            (poj1765,poj1177,poj1151,poj3277,poj2280,poj3004) 
        (3)多边形的内核(半^面交)(poj3130,poj3335) 
        (4)几何工具的综合应?(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429
)


高: 
一.基本法要求:   
      (1)代码快速写?_但不失风?nbsp;  
          (poj2525,poj1684,poj1421,poj1048,poj2050,poj3306) 
      (2)保证正确性和高效? poj3434 
?囄? 
      (1)度限制最生成树和第K最短\. (poj1639) 
      (2)最短\,最生成树,二分?最大流问题的相关理?主要是模型徏立和求解)

         (poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446 
      (3)最优比率生成树. (poj2728) 
      (4)最树形图(poj3164) 
      (5)ơ小生成? 
      (6)无向图、有向图的最环    
?数据l构.   
      (1)trie囄建立和应? (poj2778) 
      (2)LCA和RMQ问题(LCA(最q公q先问? 有离U算?q查?dfs) ?在线法

          (RMQ+dfs)).(poj1330) 
      (3)双端队列和它的应?l护一个单调的队列,常常在动态规划中起到优化状态{U?br />?nbsp;
          目的). (poj2823) 
      (4)左偏?可合q堆).   
      (5)后缀?非常有用的数据结?也是赛区考题的热?. 
         (poj3415,poj3294) 
?搜烦   
      (1)较麻烦的搜烦题目训练(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)

      (2)q搜的状态优?利用Mq制数存储状态、{化ؓ串用hash表判重、按位压~存?br />状态、双向广搜、A*法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482) 
      (3)深搜的优?量用位q算、一定要加剪枝、函数参数尽可能、层C易过?br />、可以考虑双向搜烦或者是轮换搜烦、IDA*法. (poj3131,poj2870,poj2286) 
?动态规?nbsp;  
      (1)需要用数据l构优化的动态规? 
         (poj2754,poj3378,poj3017) 
      (2)四边形不{式理论. 
      (3)较难的状态DP(poj3133) 
?数学   
      (1)l合数学. 
        1.MoBius反演(poj2888,poj2154) 
        2.偏序关系理论. 
      (2)博奕? 
        1.极大极小q程(poj3317,poj1085) 
        2.Nim问题. 
?计算几何?   
      (1)半^面求?poj3384,poj2540) 
      (2)可视囄建立(poj2966) 
      (3)炚w最圆覆盖. 
      (4)对踵?poj2079) 
      ?l合? 
      (poj3109,poj1478,poj1462,poj2729,poj2048,poj3336,poj3315,poj2148,poj1263
)



鑫龙 2012-11-26 13:00 发表评论
]]>
最堆&&最大堆的实?c++)(?http://m.shnenglu.com/mysileng/archive/2012/11/19/195384.html鑫龙鑫龙Mon, 19 Nov 2012 13:09:00 GMThttp://m.shnenglu.com/mysileng/archive/2012/11/19/195384.htmlhttp://m.shnenglu.com/mysileng/comments/195384.htmlhttp://m.shnenglu.com/mysileng/archive/2012/11/19/195384.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/195384.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/195384.htmltemplate<class T>class MinHeap {public:    MinHeap(int&nb...  阅读全文

鑫龙 2012-11-19 21:09 发表评论
]]>
全排列算法及其C++实现(?http://m.shnenglu.com/mysileng/archive/2012/11/05/194635.html鑫龙鑫龙Mon, 05 Nov 2012 13:01:00 GMThttp://m.shnenglu.com/mysileng/archive/2012/11/05/194635.htmlhttp://m.shnenglu.com/mysileng/comments/194635.htmlhttp://m.shnenglu.com/mysileng/archive/2012/11/05/194635.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/194635.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/194635.html

W十六章、全排列问题

53.字符串的排列?br />题目Q输入一个字W串Q打印出该字W串中字W的所有排列?br />例如输入字符串abcQ则输出由字Wa、b、c 所能排列出来的所有字W串
abc、acb、bac、bca、cab 和cba?/p>

    分析Q此题最初整理于d的微软面?00题中W?3题,W二ơ整理于微Y、Google{公叔R常好的面试题及解{[W?1-70题] W?7题。无独有Ӟq个问题今年又出C今年?011.10.09癑ֺW试题中。okQ接下来Q咱们先好好分析q个问题?br />

  • 一、递归实现
    从集合中依次选出每一个元素,作ؓ排列的第一个元素,然后对剩余的元素q行全排列,如此递归处理Q从而得到所有元素的全排列。以对字W串abcq行全排列ؓ例,我们可以q么做:以abcZ
    固定aQ求后面bc的排列:abcQacbQ求好后Qa和b交换Q得到bac
    固定bQ求后面ac的排列:bacQbcaQ求好后Qc攑ֈW一位置Q得到cba
    固定cQ求后面ba的排列:cbaQcab。代码可如下~写所C:
  1. template <typename T>  
  2. void CalcAllPermutation_R(T perm[], int first, int num)  
  3. {  
  4.     if (num <= 1) {  
  5.         return;  
  6.     }  
  7.       
  8.     for (int i = first; i < first + num; ++i) {  
  9.         swap(perm[i], perm[first]);  
  10.         CalcAllPermutation_R(perm, first + 1, num - 1);  
  11.         swap(perm[i], perm[first]);  
  12.     }  
  13. }  
    或者如此编写,亦可Q?div class="dp-highlighter bg_cpp" style="border: 1px dashed #999999; background-color: #f5f5f5; width: 687.0499877929688px; ">
  1. void Permutation(char* pStr, char* pBegin);  
  2.   
  3. void Permutation(char* pStr)  
  4. {  
  5.       Permutation(pStr, pStr);  
  6. }  
  7.   
  8. void Permutation(char* pStr, char* pBegin)  
  9. {  
  10.     if(!pStr || !pBegin)  
  11.         return;  
  12.       
  13.     if(*pBegin == '\0')  
  14.     {  
  15.         printf("%s\n", pStr);  
  16.     }  
  17.     else  
  18.     {  
  19.         for(char* pCh = pBegin; *pCh != '\0'; ++ pCh)  
  20.         {  
  21.             // swap pCh and pBegin  
  22.             char temp = *pCh;  
  23.             *pCh = *pBegin;  
  24.             *pBegin = temp;  
  25.               
  26.             Permutation(pStr, pBegin + 1);    
  27.             // restore pCh and pBegin  
  28.             temp = *pCh;  
  29.             *pCh = *pBegin;  
  30.             *pBegin = temp;  
  31.         }  
  32.     }  
  33. }  
  • 二、字典序排列
    把升序的排列Q当Ӟ也可以实Cؓ降序Q作为当前排列开始,然后依次计算当前排列的下一个字典序排列?br />对当前排列从后向前扫描,扑ֈ一对ؓ升序的相d素,Cؓi和jQi < jQ。如果不存在q样一对ؓ升序的相d素,则所有排列均已找刎ͼ法l束Q否则,重新对当前排列从后向前扫描,扑ֈW一个大于i的元素kQ交换i和kQ然后对从j开始到l束的子序列反{Q则此时得到的新排列׃ؓ下一个字典序排列。这U方式实现得到的所有排列是按字典序有序的,q也是C++ STL法next_permutation的思想。算法实现如下:
  1. template <typename T>  
  2. void CalcAllPermutation(T perm[], int num)  
  3. {  
  4.     if (num < 1)  
  5.         return;  
  6.           
  7.     while (true) {  
  8.         int i;  
  9.         for (i = num - 2; i >= 0; --i) {  
  10.             if (perm[i] < perm[i + 1])  
  11.                 break;  
  12.         }  
  13.           
  14.         if (i < 0)  
  15.             break;  // 已经扑ֈ所有排?/span>  
  16.       
  17.         int k;  
  18.         for (k = num - 1; k > i; --k) {  
  19.             if (perm[k] > perm[i])  
  20.                 break;  
  21.         }  
  22.           
  23.         swap(perm[i], perm[k]);  
  24.         reverse(perm + i + 1, perm + num);  
  25.          
  26.     }  
  27. }  
  扩展Q如果不是求字符的所有排列,而是求字W的所有组合,应该怎么办呢Q当输入的字W串中含有相同的字符串时Q相同的字符交换位置是不同的排列Q但是同一个组合。D个例子,如果输入abcQ它的组合有a、b、c、ab、ac、bc、abc

转自
http://blog.csdn.net/v_july_v/article/details/6879101



鑫龙 2012-11-05 21:01 发表评论
]]>
U黑树(转)http://m.shnenglu.com/mysileng/archive/2012/09/18/191149.html鑫龙鑫龙Tue, 18 Sep 2012 12:32:00 GMThttp://m.shnenglu.com/mysileng/archive/2012/09/18/191149.htmlhttp://m.shnenglu.com/mysileng/comments/191149.htmlhttp://m.shnenglu.com/mysileng/archive/2012/09/18/191149.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/191149.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/191149.html

U黑树的q

U黑树首先是一二叉查找树Q它每个l点都被标上了颜ԌU色或黑ԌQ红黑树满以下5个性质Q?/span>

1?nbsp;每个l点的颜色只能是U色或黑艌Ӏ?/span>

2?nbsp;根结Ҏ黑色的?/span>

3?nbsp;每个叶子l点都带有两个空的黑色结点(被称为黑哨兵Q,如果一个结?/span>n的只有一个左孩子Q那?/span>n的右孩子是一个黑哨兵Q如果结?/span>n只有一个右孩子Q那?/span>n的左孩子是一个黑哨兵?/span>

4?nbsp;如果一个结ҎU的Q则它的两个儿子都是黑的。也是说在一条\径上不能出现盔R的两个红色结炏V?/span>

5?nbsp;对于每个l点来说Q从该结点到其子孙叶l点的所有\径上包含相同数目的黑l点?/span>

U黑树的q?/span>5个性质中,W?/span>3Ҏ比较隄解的Q但它却非常有必要。我们看?/span>1中的左边q张图,如果不用黑哨兵Q它完全满U黑树性质Q结?/span>50C个叶l点8和叶l点82路径上的黑色l点数都?/span>2个。但如果加入黑哨兵后Q如?/span>1叛_中的黑圆点Q,叶结点的个数变ؓ8个黑哨兵Q根l点50到这8个叶l点路径上的黑高度就不一样了Q所以它q不是一늺黑树?/span>

 

 

要看真正的红黑树请在以上动画中添加几个结点,看看是否满以上性质?/span>

U黑树的旋{操作

U黑树的旋{操作?/span>AVL树一P分ؓLL?/span>RR?/span>LR?/span>RL四种旋{cdQ差别在于旋转完成后改变的是l点的颜Ԍ而不是^衡因子。旋转动LC参?/span>AVLq篇文章中的Flash动画Q?/span>

http://www.cnblogs.com/abatei/archive/2008/11/17/1335031.html

U黑树上l点的插?/span>

在讨论红黑树的插入操作之前必要明白QQ何一个即插入的新结点的初始颜色都ؓU色。这一点很Ҏ理解Q因为插入黑点会增加某条路径上黑l点的数目,从而导致整|黑高度的不^衡。但如果新结点父l点为红色时Q如?/span>2所C)Q将会违q红黑树性质Q一条\径上不能出现盔R的两个红色结炏V这时就需要通过一pd操作来ɾU黑树保持^衡?/span>

 

 

 

Z清楚地表C插入操作以下在l点中?#8220;?#8221;字表CZ个新插入的结点;使用“?#8221;字表C新插入点的父结点;使用“?#8221;字表C?#8220;?#8221;l点的兄弟结点;使用“?#8221;字表C?#8220;?#8221;l点的父l点。插入操作分Z下几U情况:

1?/span>黑父

如图3所C,如果新点的父l点为黑色结点,那么插入一个红点将不会影响U黑树的qQ此时插入操作完成。红黑树?/span>AVL树优U的地方之一在于黑父的情冉|较常见,从而ɾU黑树需要旋转的几率相对AVL树来说会一些?/span>

 

 

 

2Q红?/span>

如果新点的父l点为红Ԍq时需要进行一pd操作以保证整|U黑性质。如?/span>3所C,׃父结点ؓU色Q此时可以判定,父l点必定为黑艌Ӏ这旉要根据叔父结点的颜色来决定做什么样的操作。青色结点表C颜色未知。由于有可能需要根l点到新点的路径上进行多ơ旋转操作,而每ơ进行不q判断的v始点Q我们可其视ؓ新点Q都不一栗所以我们在此用一个蓝色箭头指向这个v始点QƈUC为判定点?/span>

 

 

 

2.1 U叔

当叔父结点ؓU色Ӟ如图4所C,无需q行旋{操作Q只要将父和叔结点变为黑Ԍ祖父结点变为红色即可。但׃父l点的父l点有可能ؓU色Q从而违反红黑树性质。此时必d父l点作ؓ新的判定点l向上进行^衡操作?/span>

 

 

需要注意,无论“?#8221;?#8220;?#8221;的左边还是右边,无论“?#8221;?#8220;?#8221;的左孩子q是叛_子,它们的操作都完全一栗?/span>

 

2.2 黑叔

当叔父结点ؓ黑色Ӟ需要进行旋转,以下囄了所有的旋{可能

情Ş1Q?/span>

 

 

情Ş2Q?/span>


情Ş3Q?/span>

 

 

情Ş4Q?/span>

 

 

可以观察刎ͼ当旋转完成后Q新的旋转根全部为黑Ԍ此时不需要再向上回溯q行q操作Q插入操作完成。需要注意,上面四张囄“?#8221;?#8220;1”?#8220;2”?#8220;3”l点有可能ؓ黑哨늻炏V?/span>

其实U黑树的插入操作不是很难Q甚xAVL树的插入操作q更单些。但删除操作pq比AVL树复杂得多,下面׃l红黑树的删除操作?/span>

U黑树上l点的删?/span>

U黑树本w是一二叉查找树Q它的删除和二叉查找树的删除cM。首先要扑ֈ真正的删除点Q当被删除结?/span>n存在左右孩子Ӟ真正的删除点应该?/span>n的中序遍在前驱,关于q一点请复习二叉查找树的删除。如?/span>9所C,当删除结?/span>20Ӟ实际被删除的l点应该?/span>18Q结?/span>20的数据变?/span>18?/span>

 

 

 

所以可以推断出Q在q行删除操作Ӟ真正的删除点必定是只有一个孩子或没有孩子的结炏V而根据红黑树的性质可以得出以下两个l论Q?/span>

1?nbsp;删除操作中真正被删除的必定是只有一个红色孩子或没有孩子的结?/span>?/span>

2?nbsp;如果真正的删除点是一个红色结点,那么它必定是一个叶子结?/span>?/span>

理解q两炚w帔R要,如图10所C,除了情况(a)外,其他MU况l点N都无法满红黑树性质?/span>

 

 

 

在以下讨ZQ我们用蓝色箭头表C真正的删除点,它也是旋转操作过E中的第一个判定点Q真正的删除点?#8220;?#8221;标注Q旧Ҏ在位|将被它的的孩子l点所取代Q最多只有一个孩子)Q我们?#8220;?#8221;表示旧点的孩子结炏V删除操作可分ؓ以下几种情ŞQ?/span>

1、旧点ؓU色l点

若旧点ؓU色l点Q则它必定是叶子l点Q直接删除即可。如?/span>11所C?/span>

 

 

 

2、一U一?/span>

当旧点ؓ黑色l点Q新点ؓU色l点Ӟ新点取代旧点位|后Q将新点染成黑色卛_Q如?/span>12所C)。这里需要注意:旧点为红Ԍ新点为黑色的情况不可能存在?/span>

 

 

 

3、双?/span>

当旧点和新点都ؓ黑色Ӟ新点为空l点Ӟ亦属于这U情况)Q情冉|较复杂,需要根据旧点兄弟结点的颜色来决定进行什么样的操作。我们?#8220;?#8221;来表C旧点的兄弟l点。这里可分ؓU兄和黑兄两U情况:

3.1 U兄

׃兄弟l点为红Ԍ所以父l点必定为黑Ԍ而旧点被删除后,新点取代了它的位|。下图演CZ两种可能的情况:

 

 

 

U兄的情况需要进?/span>RR?/span>LL型旋转,然后父l点染成U色Q兄l点染成黑色。然后重C新点为判定点q行q操作。我们可以观察到Q旋转操作完成后Q判定点没有向上回溯Q而是降低了一层,此时变成了黑兄的情况?/span>

3.2 黑兄

黑兄的情冉|为复杂,需要根据黑兄孩子结点(q里?#8220;?#8221;表示Q和父亲l点的颜色来军_做什么样的操作?/span>

3.2.1 黑兄二黑侄红?/span>

如图14所C,q种情况比较单,只需父l点变ؓ黑色Q兄l点变ؓ黑色Q新l点变ؓ黑色卛_Q删除操作到此结束?/span>

 

 

 

3.2.2 黑兄二黑侄黑?/span>

如图15所C,此时父l点染成新结点的颜色Q新l点染成黑色Q兄l点染成U色卛_。当新结点ؓU色Ӟ父结点被染成U色Q此旉要以父结点ؓ判定点l向上进行^衡操作?/span>

 


3.2.3 黑兄U侄

黑兄U侄有以下四U情形,下面分别q行囄Q?/span>

情Ş1Q?/span>

 

 

情Ş2Q?/span>

 

情Ş3Q?/span>

 

 

 

情Ş4Q?/span>

 

 

 

׃上图例所C,看完以上四张囄兄弟有可能会有一个疑问,如果情Ş1和情?/span>2中的两个侄子l点都ؓU色Ӟ是该q行LL旋{q是q行LR旋{呢?{案是进?/span>LL旋{。情?/span>3和情?/span>4则是优先q行RR旋{的判定?br />

U黑树的代码实现



鑫龙 2012-09-18 20:32 发表评论
]]>
avԾþþþa| þþþAVרվ| þˬ˸߳AV | ۺϾþþþۺ| ձvaҹĻþ| ɫۺϾþ| 99þó˹Ʒ| һɫþۺ޾Ʒ| þþ| þҹ1000ϼ| Ʒþþþþùţţapp| һĻþ| 99þùۺϾƷԭ| þҹɫƷ| ƷȾþav| 뾫Ʒþþ | þù| þ޹˾Ʒ| ˺ݺۺ88ۺϾþ| ɫƾþþþþþۺ| þѿaëƬ| ޾ƷŮþþ| ۺϾþĻӰ| ҹƷþþþþ| þþþþAVר| ŷպĻþ| 99þþùƷţ| þþƷһӰ| ùƷӰ˾þ| þøԴƷ999| þˬˬAV| þ99ȹоƷ| ձþĻ| ղƷþþһ| ŮдþӰԺ| Ⱦþվȡ| þۺ| þ97þ97Ʒӿ| ޾Ʒþþþþ| ɫ꼤þۺ| ޾þһ|