一路拾遺
          Collect By Finding All The Way ......
          posts - 81,comments - 41,trackbacks - 0
          <2010年9月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          我的博客開張啦!歡迎大家多多來踩!

          常用鏈接

          留言簿(5)

          隨筆檔案

          文章檔案

          相冊(cè)

          搜索

          •  

          積分與排名

          • 積分 - 64652
          • 排名 - 823

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          //前序中序求后序 
          #include<iostream>
          #include
          <string>
          using namespace std;
          void cc(int s,int e);
          char a[26],b[26];
          int main()
          {
              
          while(cin>>a>>b)
              
          {
                  
          int len=strlen(a);
                  cc(
          0,len-1);
                  cout
          <<endl;
              }

              
          return 0;
          }


          void cc(int s,int e)
          {   
              
          for(int i=0;i<26;i++)
                  
          for(int j=s;j<=e;j++)
                      
          if(a[i]==b[j])
                      
          {
                          cc(s,j
          -1);
                          cc(j
          +1,e);
                          cout
          <<a[i];
                          
          return;
                      }

          }


          //結(jié)構(gòu)體typedef
          #include<stdio.h>
          typedef 
          struct tree_node{
              
          char value;
              
          struct tree_node* left;
              
          struct tree_node* right;
          }
           node; 

          //素?cái)?shù)
          #include<iostream>
          #include
          <cmath>
          using namespace std;
          int  is_prime(int x)

              
          if(x == 1)return 0;
              
          int t = (int)sqrt(x);   
              
          for(int i=2; i<=t; i++)
                  
          if(x%== 0)
                      
          return 0;
              
          return 1;
          }
           

          //動(dòng)態(tài)規(guī)劃   矩陣鏈  2118

          #include
          <iostream>
          using namespace std;
          int a[10][2];
          long long f[10][10];
          int kay[10][10];
          int c(int i,int j)
          {
              
          if(i==j){kay[i][j]=i;return 0;}

              
          int u=c(i,i)+c(i+1,j)+a[i][0]*a[i][1]*a[j][1];
              kay[i][j]
          =i;
              
          for(int k=i+1;k<j;k++)
              
          {
                  
          int r=c(i,k)+c(k+1,j)+a[i][0]*a[k][1]*a[j][1];
                  
          if(r<u)
                  
          {
                      u
          =r;
                      kay[i][j]
          =k;
                  }

              }

              
          return u;
          }

          void traceback(int i,int j)
          {
              
          if(i==j)cout<<'A'<<i+1;
              
          else
              
          {
                  cout
          <<'('//int p;cin>>p;
                  traceback(i,kay[i][j]);
                  cout
          <<" x ";
                  traceback(kay[i][j]
          +1,j);
                  cout
          <<')';
              }

          }

          int main()
          {
              
          int n;int k=0;
              
          while(cin>>n&&n!=0)
              
          {
                  memset(kay,
          0,sizeof(kay));
                  memset(f,
          0,sizeof(f));
                  
          for(int i=0;i<n;i++)
                      cin
          >>a[i][0]>>a[i][1];
                  c(
          0,n-1);
                  cout
          <<"Case "<<++k<<""
                  traceback(
          0,n-1); //int p;cin>>p;
                  cout<<endl;   
              }

              
          return 0;
          }

           
          //最長公共子串
           
           #include
          <iostream>
          using namespace std;
          char s1[1000];
          char s2[1000];

          int dp[1000][1000];

          int main()
          {
              
          while(cin>>s1>>s2)
              
          {
              
          int len1 = strlen(s1);
              
          int len2 = strlen(s2);
              
              
          for(int i=0;i<=len1;i++)
                  dp[i][
          0]=0;
              
          for(int i=0;i<=len2;i++)
                  dp[
          0][i]=0;
              
              
          for(int i=0;i<len1;i++)
                  
          for(int j=0;j<len2;j++)
                  
          {
                      
          if(s1[i]==s2[j])
                          dp[i
          +1][j+1]=dp[i][j]+1;
                      
          else
                      
          {
                          dp[i
          +1][j+1= dp[i][j+1]>dp[i+1][j]?dp[i][j+1]:dp[i+1][j];
                          
                      }

                         
                  }

              cout
          <<dp[len1][len2]<<endl;
              }

              
          return 0;
          }


          //The Tower of Babylon 

          #include
          <iostream>
          using namespace std;
          int a[90][3];
          int dp[90];
          int main()
          {
              
          int n,cnt=0;
              
          while(cin>>n&&n)
              
          {
                  
          int x;
                  
          for(int i=0;i<n;i++)
                      
          for(int j=0;j<3;j++)
                      
          {
                          cin
          >>x;
                          
          for(int k=0;k<3;k++)
                              a[i
          *3+k][(j+k)%3]=x;
                      }

                
                  
                  
          for(int i=0;i<3*n;i++)
                      
          if(a[i][0]>a[i][1])
                              swap(a[i][
          0],a[i][1]);
                  
                  
          for(int i=0;i<3*n;i++)
                      
          for(int j=i+1;j<3*n;j++)
                          
          if(a[i][1]>a[j][1])
                              
          for(int k=0;k<3;k++)
                                  swap(a[i][k],a[j][k]);
                  
                  dp[
          0]=a[0][2];
                  
                  
          int maxmax=0
                  
          for(int i=1;i<3*n;i++)
                  
          {
                      
          int max=0;
                      
          for(int j=0;j<i;j++)
                          
          if(a[j][0]<a[i][0]&&a[j][1]<a[i][1]&&max<dp[j])
                              max
          =dp[j];
                      dp[i]
          =max+a[i][2];
                      
          if(maxmax<dp[i])maxmax=dp[i];
                  }

                  cout
          <<"Case "<<++cnt<<": maximum height = "<<maxmax<<endl;
              }

              
          return 0;
          }


          //二進(jìn)制數(shù)中1的個(gè)數(shù)
          #include<iostream>
          using namespace std;
          int main()
          {
              
          int n;
              
          while(cin>>n&&n)
              
          {
                  
          int k = 0;
                  
          while(n)
                  
          {
                      n 
          &= (n-1);
                      k
          ++;
                  }

                  cout
          <<k<<endl;
              }

          }


          //二分搜索
          #include<iostream>
          using namespace std;
          int binarysearch(int t);
          int n,a[100];//sorted
          int main()
          {
              
          while(cin>>n&&n)
              
          {
                  
          int t;
                  
          for(int i=0;i<n;i++)
                      cin
          >>a[i];
                  cin
          >>t;
                  cout
          <<binarysearch(t)<<endl;
              }

          }


          int binarysearch(int t)
          {
              
          int l=0,u=n-1,m;
              
          while(l<=u)
              
          {
                  m
          =(l+u)/2;
                  
          if(a[m]<t)
                      l 
          = m+1;
                  
          else if(a[m]==t)
                      
          return m;
                  
          else
                      u 
          = m-1;          
              }

              
          return -1;
          }
           

          //歸并排序mergesort

          #include
          <iostream>
          using namespace std;

          const int MAXN = 1000;
          int a[MAXN], b[MAXN];

          void merge(int left, int mid, int right)
          {
              
          int i=left, j=mid+1, k=left;
              
          while(i<=mid && j<=right)
                  
          if(a[i] < a[j])
                      b[k
          ++= a[i++];
                  
          else
                      b[k
          ++= a[j++];
              
          while(i<=mid)
                  b[k
          ++= a[i++];

              
          while(j<=right)
                  b[k
          ++= a[j++];
              
          for(i=left; i<=right; i++)
                  a[i] 
          = b[i];
          }


          void mergeSort(int left, int right)
          {
              
          if(left<right)
              
          {
                  
          int mid=(left+right)/2;
                  mergeSort(left, mid);
                  mergeSort(mid
          +1, right);
                  merge(left, mid, right);
              }

          }

          int main()
          {
              
          int i, n;
              cin 
          >> n;
              
          for(i=0; i<n; i++)
                  cin 
          >> a[i];
              mergeSort(
          0, n-1);
              
          for(i=0; i<n; i++)
                  cout 
          << a[i] << " ";
              cout 
          << endl;
              
          return 0;
          }

           
          //快速排序
          #include<iostream>
          using namespace std;
          int n,a[100];
          void qsort1(int l, int u);
          int main()
          {
              
          int n;
              
          while(cin>>n&&n)
              
          {
                  
          for(int i=0;i<n;i++)
                      cin
          >>a[i];
                  qsort1(
          0,n-1);
                  
          for(int i=0;i<n;i++)
                      cout
          <<a[i]<<" ";
              }

              
          return 1;
          }


          void qsort1(int l, int u)
          {
              
          if(l>=u)
                  
          return;
              
          int m = l;
              
          for(int i=l+1;i<=u;i++)
              
          {
                  
          if(a[i]<a[l])
                      swap(a[
          ++m],a[i]);
              }
                swap(a[l],a[m]);

              qsort1(l,m-1);
              qsort1(m
          +1,u); 
          }
           


          //找出n個(gè)數(shù)中第k大的數(shù),復(fù)雜度為:O(N*logK) 
          #include<iostream>
          using namespace std;
          int kmax(int l, int u, int k);
          int n,a[100];
          int main()
          {
              
          int k,n;
              
          while(cin>>n&&n)
              
          {
                  cin
          >>k;
                  
          for(int i=0;i<n;i++)
                      cin
          >>a[i];
                  cout
          <<kmax(0,n-1,k)<<endl; 
                  
              }

              
          return 1;
          }


          int kmax(int l, int u, int k)
          {
              
          if(l==u)
                  
          return a[l];
              
          int m = l;
              
          for(int i=l+1;i<=u;i++)
              
          {
                  
          if(a[i]<a[l])
                  
          {
                      swap(a[
          ++m],a[i]);
                  }

                  swap(a[l],a[m]);
              }

              
          if(m-l<k)
                  
          return kmax(m+1,u,k-(m-l+1));
              
          else if(m-l==k)
                  
          return a[m];
              
          else return kmax(l,m-1,k);
           
          }


          //生成n以內(nèi)隨機(jī)序列 
          //注意保證:第i個(gè)數(shù)出現(xiàn)在自己的位置上 
          #include<iostream>
          using namespace std;
          int a[100];

          int main()
          {
              
          int n;
              
          while(cin>>n&&n)
              
          {
                  a[
          1]=1;
                  
          for(int i=2;i<=n;i++)
                  
          {
                      a[i]
          =i;
                      swap(a[rand()
          %i+1],a[i]);
                  }

                  
          for(int i=1;i<=n;i++)
                      cout 
          << a[i] << " ";
                  cout
          <<endl;
              }

              
          return 0;
          }



          //生成n以內(nèi)m個(gè)有序列 

          #include
          <iostream>
          using namespace std;
          int a[100];

          int main()
          {
              
          int n,m;
              
          while(cin>>n>>m&&n)
              
          {
                  
          for(int i=0;i<n;i++)
                      
          if((rand()%(n-i))<m)
                      
          {
                          cout
          <<i<<"";
                          m
          --;
                      }

                  cout
          <<endl;
              }

              
          return 0;
          }


          //堆排序

          #include
          <iostream>
          using namespace std;
          int heap[100],len;

          void insert(int value)
          {
              
          int parent,child;
              heap[len] 
          = value;
              child 
          = len++;
              parent 
          = (child-1)/2;
              
          while(child != 0)
              
          {
                  
          if(heap[parent]>value)
                  
          {
                      swap(heap[child],heap[parent]);
                      child 
          = parent;
                      parent 
          = (child-1)/2;
                  }

                  
          else
                      
          return;
              }

          }


          int remove()
          {
              
          int root = heap[0];
              heap[
          0= heap[--len];
              
          int parent = 0, child, left, right;
              
          while(true)
              
          {
                  left 
          = parent * 2 + 1;     
                  right 
          = parent * 2 + 2;
                  
          if(left>=len) break;
                  
          if(right>=len) child = left;
                  
          else
                      child 
          = heap[left]>heap[right]?right:left;
                  
                  
          if(heap[parent]>heap[child])
                  
          {
                      swap(heap[parent], heap[child]);
                      parent 
          = child;
                  }

                  
          else
                      
          break;
              }

              
          return root;
          }


          int main()
          {
              
          int k;
              
          while(cin>>k&&k)
              
          {
                  len
          =0;
                  
          for(int i=0;i<k;i++)
                  
          {
                      
          int a;
                      cin
          >>a;
                      insert(a);
                  }

                  
          for(int i=0;i<k;i++)
                      cout
          <<remove()<<" ";
              }

          }


          /*最長重復(fù)子串
          **共分3步
          **1.得到后綴數(shù)組
          **2.對(duì)后綴數(shù)組按字母順序排序
          **3.比較相鄰兩個(gè),并且一定是從開頭就開始比較,得到兩個(gè)的最長公共長度。
          **4.取所有比較結(jié)果的最大值。
          */
           
          #include
          <iostream>
          using namespace std;
          char a[100],b[100][100];

          int comlen(char *p, char *q)
          {
              
          int i=0;
              
          while(*p&&(*p++==*q++))
                  i
          ++;
              
          return i;
          }

          //qsort要求的cmp參數(shù)格式 
          int cmp(const void *p, const void *q)
          {
              
          return strcmp((const char*)p, (const char*)q);
          }


          int main()
          {
              
          while(cin>>a)
              
          {
                  
          int len = strlen(a);
                  
          for(int i=0;i<len;i++)
                  
          {
                      
          int j = i;
                      
          int k = 0;
                      
          while(a[j])
                          b[i][k
          ++]=a[j++];
                  }

                  qsort(b,len,
          sizeof(b[0]),cmp);
                  
          int re = 0;
                  
          for(int i=0;i<len-1;i++)
                  
          {
                      
          int com = comlen(b[i], b[i+1]);
                      re 
          = max(re, com);
                  }

                  cout
          <<re<<endl;
              }

              
          return 0;
          }


           
          posted on 2010-09-05 16:08 胖胖泡泡 閱讀(427) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 萝北县| 铜山县| 西宁市| 泸定县| 承德市| 通化市| 双城市| 西贡区| 咸丰县| 驻马店市| 商河县| 临城县| 黑山县| 会泽县| 梅河口市| 潍坊市| 益阳市| 慈利县| 日照市| 夏邑县| 郴州市| 波密县| 墨竹工卡县| 平阴县| 安仁县| 吉安市| 南平市| 静乐县| 疏勒县| 腾冲县| 日照市| 涿州市| 平武县| 河东区| 长武县| 五台县| 咸宁市| 曲松县| 吴桥县| 博白县| 通州区|