《编程珠玑》读书笔记——代码实现

《编程珠玑》读书笔记——代码实现
// 前序中序求后序 
#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;
            }

}


// 结构体typedef
#include < stdio.h >
typedef 
struct  tree_node {
    
char value;
    
struct tree_node* left;
    
struct tree_node* right;
}
 node; 

// 素数
#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;
}
 

// 动态规划   矩阵链  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;
}


// 二进制数中1的个数
#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个数中第k大的数,复杂度为: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以内随机序列 
// 注意保证:第i个数出现在自己的位置上 
#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以内m个有序列 

#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()<<" ";
    }

}


/**/ /*最长重复子串
**共分3步
**1.得到后缀数组
**2.对后缀数组按字母顺序排序
**3.比较相邻两个,并且一定是从开头就开始比较,得到两个的最长公共长度。
**4.取所有比较结果的最大值。
*/
 
#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参数格式 
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;
}


 

你可能感兴趣的:(《编程珠玑》读书笔记——代码实现)