??xml version="1.0" encoding="utf-8" standalone="yes"?>浪潮AV色综合久久天堂,亚洲国产成人久久一区WWW,99久久99久久精品国产http://www.shnenglu.com/luyulaile/category/11048.htmlI canzh-cnFri, 18 Nov 2011 06:13:24 GMTFri, 18 Nov 2011 06:13:24 GMT60长春赢鼎教育公司 原是传销机构http://www.shnenglu.com/luyulaile/archive/2011/05/01/145469.htmlluisluisSun, 01 May 2011 10:31:00 GMThttp://www.shnenglu.com/luyulaile/archive/2011/05/01/145469.htmlhttp://www.shnenglu.com/luyulaile/comments/145469.htmlhttp://www.shnenglu.com/luyulaile/archive/2011/05/01/145469.html#Feedback3http://www.shnenglu.com/luyulaile/comments/commentRss/145469.htmlhttp://www.shnenglu.com/luyulaile/services/trackbacks/145469.html长春赢鼎教育公司长春赢鼎教育公司 原是传销机构
http://www.szxkd.com/a/infos/2010/0728/42578.html
q日Q记者获悉,一起以教育为借口的传销团体Q在长春逐渐扩大?span class=Apple-converted-space> 

  北京赢鼎教育机构长春分公司,实际上是长春赢鼎教育公司Q该公司挂着北京的名P在长春各大高校,以大量的“高薪求职”|诱导学生一人缴U会员费Q?480元,会员费缴UxE收发票Q只有收据。现在该团队吸纳的会员数逐渐扩大Q预计达三千人?span class=Apple-converted-space> 
  眼睁睁看着q个传销团队在长春各大高校滋生蔓Ӟ记者进入该团队q行了暗访调查得知一些情况: 
  一、该公司在没有提供实质性业务或服务情况下,以发展h员数量ؓ主要l济来源Q?span class=Apple-converted-space> 
  二、以宣传“高薪职场”或承?#8220;推荐学生q入500Z业工?#8221;饵,采取非法集会Qy立名目或以品变相收取不{h、不客观的费用进行非法集资; http:/// 
  三、以提供求职面试服务Q?00强公司HR与大学生面对面,会员有机会获得去香港旅游Q手机,电脑为幌子,从事集资诈骗{违法犯|的商业Q用ƺ骗手段甚至不断z脑诱导q行交易的敛财行为; 
  1、该公司Ll学生孩子们推荐500强工作。其实不是,是诱导前提,而所谓的工作Q是l他们机构做免费的实习生?span class=Apple-converted-space> 
  2、该公司任课老师全部不是正规大学毕业的,而是一些没有正规学历背景的个h。其中号U全球职业规划师的,其实只是化妆师(教礼仪Ş象)Q或者有的号U全球职业企业高U管理hQ其实是不知名单位某人力l理?span class=Apple-converted-space> 
  3、以高薪教育导点Q媄响在校学生们正常上课Q甚至翘课,不参加晚自习{,g命也要去上他们的课?span class=Apple-converted-space> 
4、所有报名费全无E收发票?span class=Apple-converted-space> 
  5、该团队所有工作hQ全部以团队竞争为模式:互相比较每一期课E、哪一l?#8220;忽悠”的学生最多,q从中提成,谁忽悠的学生最多,谁的提成最高?span class=Apple-converted-space> 
  6、如果交了会员费Q就l对不可能再退贏V?span class=Apple-converted-space> 
  7、我们还有幸从该机构一名员工口中得知:该机构组l者对员工的承诺是Q争?012q_我们在纳斯达克上市。还承诺Q年底将q军北京Q优U的员工,进军各大省市当代理处总负责h。而实际是Q该机构可怜无辜的员工Q从早上7点去上班Q晚?0Ҏ下班。一个月只有1天的休息日。五一加班公司Ҏ不给加班贏V一个月工资只有1000元。而员工的提成Q公怹有各U借口扣下。开始讲的是挺激׃hQ现场的孩子们都被感染了。很明显Q都是些大一大二的孩子,刚进大学。对职场Ҏ不了解,他们讲的q些老套的东西,对大一大二的孩子就起到一个诱导的效果?span class=Apple-converted-space> 
  公司每一ơ所谓的免费宣战之后Q学生们p被诱导参加他们的会员评。每一个会员交费一千多。号U可以给孩子们推?00强工作实习机会,或者给孩子们推荐工作等{。实际上是有推荐工作了:l他们赢鼎当免费的劳动力?span class=Apple-converted-space> 
  当他们宣讲结束后问他们的老师Qؓ什么ȝ大一大二孩子讲课Q也l大三大四的孩子讲讲职场嘛。老师的回{让记者感到很吃惊Q大三大四的不好z脑?span class=Apple-converted-space> 
  随后Q记者电话至该公怺解其相关情况Q当记者问赯公司的经营范围是什么时Q公司内部h员却{不上来Qƈ且否认有传销性质的活动?span class=Apple-converted-space> 
  记者联pd该公司法Z表,法h一口否认公司的传销性质Qƈ说有各大学的聘书Q而记者所见的该公司的营业执照q不规范Q没有注明公司经营范围?span class=Apple-converted-space> 
  此后Q记者再想了解一些相x况,q要查询相关收费许可证及收费标准Ӟ公司Ҏ不接电话Q公司法Z拒接回避?span class=Apple-converted-space> 
  长春赢鼎教育公司长春赢鼎教育公司 原是传销机构!

luis 2011-05-01 18:31 发表评论
]]>
ZSocket的UDP和TCP~程介绍 http://www.shnenglu.com/luyulaile/archive/2010/09/12/126443.htmlluisluisSun, 12 Sep 2010 02:41:00 GMThttp://www.shnenglu.com/luyulaile/archive/2010/09/12/126443.htmlhttp://www.shnenglu.com/luyulaile/comments/126443.htmlhttp://www.shnenglu.com/luyulaile/archive/2010/09/12/126443.html#Feedback0http://www.shnenglu.com/luyulaile/comments/commentRss/126443.htmlhttp://www.shnenglu.com/luyulaile/services/trackbacks/126443.html ZSocket的UDP和TCP~程介绍
转帖自:apps.hi.baidu.com/share/detail/8484629
一、概q?

  TCPQ传输控制协议)和UDPQ用h据报协议是网l体pȝ构TCP/IP模型中传输层一层中的两个不同的通信协议?/span>

  TCPQ传输控制协议,一U面向连接的协议Q给用户q程提供可靠的全双工的字节流QTCP套接口是字节套接口(stream socket)的一U?/span>

  UDPQ用h据报协议。UDP是一U无q接协议。UDP套接口是数据报套接口(datagram socket)的一U?/span>

  二、TCP和UDP介绍

  1Q基本TCP客户—服务器E序设计基本框架

 

  说明Q(三\握手Q?/span>

  1.客户端发送一个SYND(同步序号Q指明客h连接的服务器端口,以及初始化序?ISN) ?/span>

  2.服务器发回包含服务器的初始序LSYN报文D作为应{。同Ӟ确认序?ACK)讄为客LISN?以对客户的SYN 报文D进行确认。一个SYN占用一个序受?/span>

  3.客户必须确认序可|ؓ服务器的ISN?以对服务器的SYN报文D进行确认?/span>

  2) 基本TCP客户—服务器E序设计基本框架程?br>

 

  3) UDP和TCP的对比:

  从上面的程图比较我们可以很明显的看出UDP没有三次握手q程?br>

  单点说。UDP处理的细节比TCP。UDP不能保证消息被传送到Q它也报告消息没有传送到Q目的地。UDP也不保证数据包的传送顺序。UDP把数据发出去后只能希望它能够抵达目的地?/span>

  TCP优缺点:

  优点Q?/span>

  1QTCP提供以认可的方式昑ּ地创建和l止q接?/span>

  2QTCP保证可靠的、顺序的Q数据包以发送的序接收Q以及不会重复的数据传输?/span>

  3QTCP处理控制?/span>

  4Q允许数据优?/span>

  5Q如果数据没有传送到Q则TCP套接口返回一个出错状态条件?/span>

  6QTCP通过保持q箋q将数据块分成更的分片来处理大数据块。—无需E序员知?/span>

  ~点Q?TCP在{UL据时必须创徏Qƈ保持Q一个连接。这个连接给通信q程增加了开销Q让它比UDP速度要慢?/span>

  UDP优缺点:

  1QUDP不要求保持一个连?/span>

  2QUDP没有因接收方认可收到数据包(或者当数据包没有正抵达而自动重传)而带来的开销?/span>

  3Q设计UDP的目的是用于短应用和控制消息

  4Q在一个数据包q接一个数据包的基上,UDP要求的网l带宽比TDP更小?/span>

  三、Socket~程

  Socket接口是TCP/IP|络的APIQSocket接口定义了许多函数或例程Q程序员可以用它们来开发TCP/IP|络上的应用E序。要学Internet上的TCP/IP|络~程Q必ȝ解Socket接口?/span>

  Socket接口设计者最先是接口放在Unix操作pȝ里面的。如果了解Unixpȝ的输入和?出的话,很Ҏ了解Socket了。网l的Socket数据传输是一U特D的I/OQSocket也是一U文件描q符。Socket也具有一个类g?开文g的函数调用Socket()Q该函数q回一个整型的Socket描述W,随后的连接徏立、数据传输等操作都是通过该Socket实现的。常用的 Socketcd有两U:式SocketQSOCK_STREAMQ和数据报式SocketQSOCK_DGRAMQ。流式是一U面向连接的 SocketQ针对于面向q接的TCP服务应用Q数据报式Socket是一U无q接的SocketQ对应于无连接的UDP服务应用?/span>

  1、socket调用库函C要有Q?/span>

  创徏套接?/span>

  Socket(af,type,protocol)

  建立地址和套接字的联p?/span>

  bind(sockid, local addr, addrlen)

  服务器端侦听客户端的h

  listen( Sockid ,quenlen)

  建立服务?客户端的q接 (面向q接TCPQ?/span>

  客户端请求连?/span>

  Connect(sockid, destaddr, addrlen)

  服务器端{待从编号ؓSockid的Socket上接收客戯接请?/span>

  newsockid=accept(SockidQClientaddr, paddrlen)

  发?接收数据

  面向q接Qsend(sockid, buff, bufflen)

  recv( )

  面向无连接:sendto(sockid,buff,…,addrlen)

  recvfrom( )

  释放套接?/span>

  close(sockid)

  2、TCP/IP应用~程接口QAPIQ?/span>

  服务器的工作程Q首先调用socket函数创徏一个SocketQ然后调用bind函数其与本 机地址以及一个本地端口号l定Q然后调用listen在相应的socket?Q当accpet接收C个连接服务请求时Q将生成一个新的socket?服务器显C客户机的IP地址Qƈ通过新的socket向客L发送字W串" hi,I am server!"。最后关闭该socket?br>

main()
{
int sock_fd,client_fd; /*sock_fdQ?socketQclient_fdQ数据传输socket */
struct sockaddr_in ser_addr; /* 本机地址信息 */
struct sockaddr_in cli_addr; /* 客户端地址信息 */
char msg[MAX_MSG_SIZE];/* ~冲?/
ser_sockfd=socket(AF_INET,SOCK_STREAM,0);/*创徏q接的SOCKET */
if(ser_sockfd<0)
{/*创徏p| */
fprintf(stderr,"socker Error:%s\n",strerror(errno));
exit(1);
}
/* 初始化服务器地址*/
addrlen=sizeof(struct sockaddr_in);
bzero(&ser_addr,addrlen);
ser_addr.sin_family=AF_INET;
ser_addr.sin_addr.s_addr=htonl(INADDR_ANY);
ser_addr.sin_port=htons(SERVER_PORT);
if(bind(ser_sockfd,(struct sockaddr*)&ser_addr,sizeof(struct sockaddr_in))<0)
{ /*l定p| */
fprintf(stderr,"Bind Error:%s\n",strerror(errno));
exit(1);
}
/*侦听客户端请?/
if(listen(ser_sockfd,BACKLOG)<0)
{
fprintf(stderr,"Listen Error:%s\n",strerror(errno));
close(ser_sockfd);
exit(1);
}
while(1)
{/* {待接收客户q接h*/
cli_sockfd=accept(ser_sockfd,(struct sockaddr*) &         cli_addr,&addrlen);
if(cli_sockfd<=0)
{
fprintf(stderr,"Accept Error:%s\n",strerror(errno));
}
else
{/*开始服?/
recv(cli_addr,msg,MAX_MSG_SIZE,0); /* 接受数据*/
printf("received a connection from %sn", inet_ntoa(cli_addr.sin_addr));
printf("%s\n",msg);/*在屏q上打印出来 */
strcpy(msg,"hi,I am server!");
send(cli_addr,msg,sizeof(msg),0); /*发送的数据*/
close(cli_addr);
}
}
close(ser_sockfd);
}

  客户端的工作程Q首先调用socket函数创徏一个SocketQ然后调用bind函数其与本机地址以及一个本地端口号l定Q请求连接服务器Q通过新的socket向客L发送字W串" hi,I am client!"。最后关闭该socket?/p>

main()
{
int cli_sockfd;/*客户端SOCKET */
int addrlen;
char seraddr[14];
struct sockaddr_in ser_addr,/* 服务器的地址*/
cli_addr;/* 客户端的地址*/
char msg[MAX_MSG_SIZE];/* ~冲?/
GetServerAddr(seraddr);
cli_sockfd=socket(AF_INET,SOCK_STREAM,0);/*创徏q接的SOCKET */
if(ser_sockfd<0)
{/*创徏p| */
fprintf(stderr,"socker Error:%s\n",strerror(errno));
exit(1);
}
/* 初始化客L地址*/
addrlen=sizeof(struct sockaddr_in);
bzero(&ser_addr,addrlen);
cli_addr.sin_family=AF_INET;
cli_addr.sin_addr.s_addr=htonl(INADDR_ANY);
cli_addr.sin_port=0;
if(bind(cli_sockfd,(struct sockaddr*)&cli_addr,addrlen)<0)
{
/*定p| */
fprintf(stderr,"Bind Error:%s\n",strerror(errno));
exit(1);
}
/* 初始化服务器地址*/
addrlen=sizeof(struct sockaddr_in);
bzero(&ser_addr,addrlen);
ser_addr.sin_family=AF_INET;
ser_addr.sin_addr.s_addr=inet_addr(seraddr);
ser_addr.sin_port=htons(SERVER_PORT);
if(connect(cli_sockfd,(struct sockaddr*)&ser_addr,&addrlen)!=0)/*hq接*/
{
/*q接p| */
fprintf(stderr,"Connect Error:%s\n",strerror(errno));
close(cli_sockfd);
exit(1);
}
strcpy(msg,"hi,I am client!");
send(sockfd,msg,sizeof(msg),0);/*发送数?/
recv(sockfd,msg,MAX_MSG_SIZE,0); /* 接受数据*/
printf("%s\n",msg);/*在屏q上打印出来 */
close(cli_sockfd);
}

  3、UDP/IP应用~程接口QAPIQ?/strong>

  服务器的工作程Q首先调用socket函数创徏一个SocketQ然后调用bind函数其与本机地址以及一个本地端口号l定Q接收到一个客LӞ服务器显C客户端的IP地址Qƈ字串返回给客户端?/p>

int main(int argc,char **argv)
{
int ser_sockfd;
int len;
//int addrlen;
socklen_t addrlen;
char seraddr[100];
struct sockaddr_in ser_addr;
/*建立socket*/
ser_sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(ser_sockfd<0)
{
printf("I cannot socket success\n");
return 1;
}
/*填写sockaddr_in l构*/
addrlen=sizeof(struct sockaddr_in);
bzero(&ser_addr,addrlen);
ser_addr.sin_family=AF_INET;
ser_addr.sin_addr.s_addr=htonl(INADDR_ANY);
ser_addr.sin_port=htons(SERVER_PORT);
/*l定客户?br>if(bind(ser_sockfd,(struct sockaddr *)&ser_addr,addrlen)<0)
{
printf("connect");
return 1;
}
while(1)
{
bzero(seraddr,sizeof(seraddr));
len=recvfrom(ser_sockfd,seraddr,sizeof(seraddr),0,(struct sockaddr*)&ser_addr,&addrlen);
/*昄client端的|络地址*/
printf("receive from %s\n",inet_ntoa(ser_addr.sin_addr));
/*昄客户端发来的字串*/
printf("recevce:%s",seraddr);
/*字串返回给client?/
sendto(ser_sockfd,seraddr,len,0,(struct sockaddr*)&ser_addr,addrlen);
}
}

  客户端的工作程Q首先调用socket函数创徏一个SocketQ填写服务器地址及端口号Q从标准输入讑֤中取得字W串Q将字符串传送给服务器端Qƈ接收服务器端q回的字W串。最后关闭该socket?/p>

int GetServerAddr(char * addrname)
{
printf("please input server addr:");
scanf("%s",addrname);
return 1;
}
int main(int argc,char **argv)
{
int cli_sockfd;
int len;
socklen_t addrlen;
char seraddr[14];
struct sockaddr_in cli_addr;
char buffer[256];
GetServerAddr(seraddr);
/* 建立socket*/
cli_sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(cli_sockfd<0)
{
printf("I cannot socket success\n");
return 1;
}
/* 填写sockaddr_in*/
addrlen=sizeof(struct sockaddr_in);
bzero(&cli_addr,addrlen);
cli_addr.sin_family=AF_INET;
cli_addr.sin_addr.s_addr=inet_addr(seraddr);
//cli_addr.sin_addr.s_addr=htonl(INADDR_ANY);
cli_addr.sin_port=htons(SERVER_PORT);

bzero(buffer,sizeof(buffer));
/* 从标准输入设备取得字W串*/
len=read(STDIN_FILENO,buffer,sizeof(buffer));
/* 字W串传送给server?/
sendto(cli_sockfd,buffer,len,0,(struct sockaddr*)&cli_addr,addrlen);
/* 接收server端返回的字符?/
len=recvfrom(cli_sockfd,buffer,sizeof(buffer),0,(struct sockaddr*)&cli_addr,&addrlen);
//printf("receive from %s\n",inet_ntoa(cli_addr.sin_addr));
printf("receive: %s",buffer);
close(cli_sockfd);
}



luis 2010-09-12 10:41 发表评论
]]>
[转蝲]Vector遍历http://www.shnenglu.com/luyulaile/archive/2010/01/26/106444.htmlluisluisTue, 26 Jan 2010 01:08:00 GMThttp://www.shnenglu.com/luyulaile/archive/2010/01/26/106444.htmlhttp://www.shnenglu.com/luyulaile/comments/106444.htmlhttp://www.shnenglu.com/luyulaile/archive/2010/01/26/106444.html#Feedback0http://www.shnenglu.com/luyulaile/comments/commentRss/106444.htmlhttp://www.shnenglu.com/luyulaile/services/trackbacks/106444.htmlimport java.util.Iterator;
import java.util.Vector;

public class VectorIterator implements Iterator{
    
     private Vector v;
    
     private int currentIndex=0;
    
     public VectorIterator(){
        
     }
    
     public VectorIterator(Vector v){
         this.v=v;
     }    

     public boolean hasNext() {                
         if(this.currentIndex<this.v.size()){
             System.out.println("current index is :   "+this.currentIndex);
             return true;
         }else{
             System.out.println("out of the bound ");
         }
         return false;
     }

     public Object next() {            
         return this.v.get(this.currentIndex++);
     }

     public void remove() {
         this.v.remove(this.currentIndex);        
     }
    
    
     public static void main(String[] args){
         Vector v=new Vector();
         v.add(new String("aaa"));
         v.add(new String("bbb"));
         v.add(new String("ccc"));
         //System.out.println(v);
        
        
         Iterator iter=new VectorIterator(v);
         while(iter.hasNext()){
             String str=(String)iter.next();
             System.out.println(str);
         }
     }
    
}

luis 2010-01-26 09:08 发表评论
]]>
java Vector排序及用?/title><link>http://www.shnenglu.com/luyulaile/archive/2010/01/26/106439.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Mon, 25 Jan 2010 17:48:00 GMT</pubDate><guid>http://www.shnenglu.com/luyulaile/archive/2010/01/26/106439.html</guid><wfw:comment>http://www.shnenglu.com/luyulaile/comments/106439.html</wfw:comment><comments>http://www.shnenglu.com/luyulaile/archive/2010/01/26/106439.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/luyulaile/comments/commentRss/106439.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/luyulaile/services/trackbacks/106439.html</trackback:ping><description><![CDATA[<p>temp=CustomerMaker.quickPassQueue.get(0);//获得首元?br />  CustomerMaker.quickPassQueue.remove(0);//删除首元?br /><br /> quickPassQueue.add();在末添加元?br />----演示E序-----<br /><br />import java.util.*;<br />import java.io.*;<br /><br />public class test<br />{<br />Vector v = new Vector();<br /><br />public void testMethod(){<br />  v.add("a");<br />  v.add("b");<br />  v.add("c");<br /><br />  System.out.println("\n原来的vecotr");<br />  for(int i=0;i<v.size();i++){<br />   System.out.println("\n"+" index is: "+ i + " element is: " +v.get(i));<br />  }<br /><br />  v.remove(0);<br /><br />  System.out.println("\nL一个vector中第一个元?);<br />  for(int i=0;i<v.size();i++){<br />   System.out.println("\n"+" index is: "+ i + " element is: " +v.get(i));<br />  }<br />}<br /><br />public static void main(String[] args) <br />{<br />  test t = new test();<br />  t.testMethod();<br />  System.out.println("Hello World!");<br />}<br />}<br />-----------------排序E序------------------------------<br />import java.util.*;</p> <p>class MyCompare implements Comparator //实现ComparatorQ定义自q比较Ҏ<br />{<br />public int compare(Object o1, Object o2) {<br />Elem e1=(Elem)o1;<br />Elem e2=(Elem)o2;<br /><br />if(e1.get() > e2.get())//q样比较是降?如果?1Ҏ1是升序.<br />{<br />   return -1;<br />}<br />else if(e1.get()<e2.get())<br />{<br />   return 1;<br />}<br />else<br />{<br />   return 0;<br />}<br />}<br />}</p> <p>class Elem {<br />private int iVal;</p> <p>public Elem(int i) {<br />   this.iVal = i;<br />}</p> <p>public int get() {<br />   return this.iVal;<br />}<br />}</p> <p>public class Vector1 {<br />public static void main(String[] args) {<br />   List v = new Vector();<br />   v.add(new Elem(1));<br />   v.add(new Elem(22));<br />   v.add(new Elem(3));<br />   v.add(new Elem(14));<br />   Comparator ct = new MyCompare();<br />   Collections.sort(v, ct);<br />   for (int i = 0; i < v.size(); i++)<br />    System.out.println(((Elem) v.get(i)).get());</p> <p>}</p> <p>}<br /></p><img src ="http://www.shnenglu.com/luyulaile/aggbug/106439.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/luyulaile/" target="_blank">luis</a> 2010-01-26 01:48 <a href="http://www.shnenglu.com/luyulaile/archive/2010/01/26/106439.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转蝲]使用 Java ~程语言实现U程 http://www.shnenglu.com/luyulaile/archive/2010/01/26/106437.htmlluisluisMon, 25 Jan 2010 17:17:00 GMThttp://www.shnenglu.com/luyulaile/archive/2010/01/26/106437.htmlhttp://www.shnenglu.com/luyulaile/comments/106437.htmlhttp://www.shnenglu.com/luyulaile/archive/2010/01/26/106437.html#Feedback0http://www.shnenglu.com/luyulaile/comments/commentRss/106437.htmlhttp://www.shnenglu.com/luyulaile/services/trackbacks/106437.html使用 Java ~程语言实现U程

  Java~程语言使多U程如此单有效,以致于某些程序员说它实际上是自然的。尽在 Java 中用线E比在其他语a中要Ҏ得多Q仍然有一些概念需要掌握。要C的一仉要的事情?/span> main() 函数也是一个线E,q可用来做有用的工作。程序员只有在需要多个线E时才需要创建新的线E?/span>

  Thread c?/span>

  Thread cL一个具体的c,即不是抽象类Q该cd装了U程的行为。要创徏一个线E,E序员必dZ个从 Thread cd出的新类。程序员必须覆盖 Thread ?/span> run() 函数来完成有用的工作。用户ƈ不直接调用此函数Q而是必须调用 Thread ?/span> start() 函数Q该函数再调?/span> run()。下面的代码说明了它的用法:

  创徏两个新线E?/span>

import java.util.*;

class TimePrinter extends Thread {
 int pauseTime;
 String name;
 public TimePrinter(int x, String n) {
  pauseTime = x;
  name = n;
 }

 public void run() {
  while(true) {
   try {
    System.out.println(name + ":" + new Date(System.currentTimeMillis()));
    Thread.sleep(pauseTime);
   } catch(Exception e) {
    System.out.println(e);
   }
  }
 }

 static public void main(String args[]) {
  TimePrinter tp1 = new TimePrinter(1000, "Fast Guy");
  tp1.start();
  TimePrinter tp2 = new TimePrinter(3000, "Slow Guy");
  tp2.start();

 }
}


  在本例中Q我们可以看C个简单的E序Q它按两个不同的旉间隔Q?/span>1 U和 3 U)在屏q上昄当前旉。这是通过创徏两个新线E来完成的,包括 main() ׃个线E。但是,因ؓ有时要作为线E运行的cd能已l是某个cdơ的一部分Q所以就不能再按q种机制创徏U程。虽然在同一个类中可以实CQ意数量的接口Q但 Java ~程语言只允怸个类有一个父cR同Ӟ某些E序员避免从 Thread cd出,因ؓ它强加了cdơ。对于这U情况,p runnable 接口?/span>

  Runnable 接口

  此接口只有一个函敎ͼrun()Q此函数必须由实C此接口的cd现。但是,p行这个类而论Q其语义与前一个示例稍有不同。我们可以用 runnable 接口改写前一个示例。(不同的部分用黑体表示。)

  创徏两个新线E而不强加cd?/span>

import java.util.*;

class TimePrinter implements Runnable {
 int pauseTime;
 String name;
 public TimePrinter(int x, String n) {
  pauseTime = x;
  name = n;
 }

 public void run() {
  while(true) {
   try {
    System.out.println(name + ":" + new Date(System.currentTimeMillis()));
    Thread.sleep(pauseTime);
   } catch(Exception e) {
    System.out.println(e);
   }
  }
 }

 static public void main(String args[]) {
  Thread t1 = new Thread(new TimePrinter(1000, "Fast Guy"));
  t1.start();
  Thread t2 = new Thread(new TimePrinter(3000, "Slow Guy"));
  t2.start();
 }
}



  h意,当?/span> runnable 接口Ӟ您不能直接创建所需cȝ对象q运行它Q必M Thread cȝ一个实例内部运行它。许多程序员更喜?/span> runnable 接口Q因Z Thread cȝ承会强加cdơ?/span>

  synchronized 关键?/span>

  到目前ؓ止,我们看到的示例都只是以非常简单的方式来利用线E。只有最的数据,而且不会出现两个U程讉K同一个对象的情况。但是,在大多数有用的程序中Q线E之间通常有信息流。试考虑一个金融应用程序,它有一?/span> Account 对象Q如下例中所C:

  一个银行中的多Ҏ?/span>

public class Account {
 String holderName;
 float amount;
 public Account(String name, float amt) {
 holderName = name;
 amount = amt;
}

public void deposit(float amt) {
 amount += amt;
}

public void withdraw(float amt) {
 amount -= amt;
}

public float checkBalance() {
 return amount;
}
}


  在此代码样例中潜伏着一个错误。如果此cȝ于单U程应用E序Q不会有M问题。但是,在多U程应用E序的情况中Q不同的U程有可能同时讉K同一?/span> Account 对象Q比如说一个联合帐L所有者在不同?/span> ATM 上同时进行访问。在q种情况下,存入和支出就可能以这L方式发生Q一个事务被另一个事务覆盖。这U情况将是灾难性的。但是,Java ~程语言提供了一U简单的机制来防止发生这U覆盖。每个对象在q行旉有一个关联的锁。这个锁可通过为方法添加关键字 synchronized 来获得。这P修订q的 Account 对象Q如下所C)不会遭受像数据损坏q样的错误:

  对一个银行中的多Ҏ动进行同步处?/span>

public class Account {
 String holderName;
 float amount;
 public Account(String name, float amt) {
 holderName = name;
 amount = amt;
}

public synchronized void deposit(float amt) {
 amount += amt;
}

public synchronized void withdraw(float amt) {
 amount -= amt;
}

public float checkBalance() {
 return amount;
}
}


  deposit() ?/span> withdraw() 函数都需要这个锁来进行操作,所以当一个函数运行时Q另一个函数就被阻塞。请注意Q?/span> checkBalance() 未作更改Q它严格是一个读函数。因?/span> checkBalance() 未作同步处理Q所以Q何其他方法都不会d它,它也不会dM其他ҎQ不那些方法是否进行了同步处理



luis 2010-01-26 01:17 发表评论
]]>
joj 1092 To the Max 转帖Dpl典http://www.shnenglu.com/luyulaile/archive/2009/07/09/89674.htmlluisluisThu, 09 Jul 2009 10:37:00 GMThttp://www.shnenglu.com/luyulaile/archive/2009/07/09/89674.htmlhttp://www.shnenglu.com/luyulaile/comments/89674.htmlhttp://www.shnenglu.com/luyulaile/archive/2009/07/09/89674.html#Feedback0http://www.shnenglu.com/luyulaile/comments/commentRss/89674.htmlhttp://www.shnenglu.com/luyulaile/services/trackbacks/89674.html[原创]POJ1050 To the Max 解题报告
2006-04-17 11:55
题目大意:

d一个n*n的数l?比如 

0 -2 -7 0 

9 2 -6 2 

-4 1 -4 1 

-1 8 0 -2  

从里面Q意截取一个矩?使得矩阵所包含的数字的和最?

截取出来的矩?和ؓ15

9 2 

-4 1 

-1 8 

---------------------------------------------------------

POJ 1050 我的解题报告Q?br>
q个题目很经典的_OQN^3Q的DP?br>
首先偶们考察q样的题目,化版Q?br>
已知一列数Q求Lq箋若干个数和的最大倹{?br>
SAMPLEQ?nbsp;3 2 -6 2 -1 7

原数3        2      -6       2      -1       7 

处理3        5      -1       2       1       8

因ؓ是连l若q个自然数的和,那么Q前面的某个数字取与不取的条件在于:以前面这个数字ؓl尾的连l数的和最大值是否大?Q如果大?Q那么这个数字必然要会出现在包括数字的序列中Q否则无法做到最大?br>
所以,昄。处理的原则是maxn[i]=max{0,maxn[i-1]}+a[i];

׃无须记录位置。所以,可以直接用一个变量sum代替maxn数组。O(n)的扫描即可?br>
单列数字的问题解决了Q下面我们考察多列数字?br>
sample:

         0    -2    -7    0 

         9     2    -6    2 

        -4     1    -4    1 

        -1     8     0   -2 



我们可以多列数字{换成单列数字来做Q?nbsp;可以q样设想Q结果是一个长方ŞQ我们把他压扁,使得宽ؓ1?br>
引入辅助数组st,st[i][j]代表Wi列从W?行开始的数字累加到第j行的倹{那么,我们每次压扁的时候,可以用st[i][j]-st[i][k-1]来表C第i列从Wk个数字篏加到Wj个数字的倹{达到压~的效果。然后用上面单列数字的方法来做。算法时间复杂度O (N^3)

Source



Problem Id:1050  User Id:galaxy 

Memory:112K  Time:0MS

Language:G++  Result:Accepted



/*

  Name:POJ 1050 

  Copyright: flymouse@galaxy                                         

  Author:chenlei

  Date: 15-02-06 07:36

  Description: DP O(N^3)

*/

#include <stdio.h>

#include <string.h>

#define mt 101

int main()

{

int a[mt][mt];

int st[mt][mt];

int p,k,n,i,j,sum,maxn;

//freopen("in.txt","r",stdin);

scanf("%d",&n);

for (i=1;i<=n;i++)

for (j=1;j<=n;j++)

scanf("%d",&a[i][j]);

memset(st,0,sizeof(st));

for (i=1;i<=n;i++)

   for (j=1;j<=n;j++)

  st[i][j]=st[i][j-1]+a[j][i];

  maxn=0;

   for (i=1;i<=n;i++)

   {

for (j=i;j<=n;j++)

{

p=st[1][j]-st[1][i-1];

sum=p;

for (k=2;k<=n;k++)

{

if (sum>0)

sum+=st[k][j]-st[k][i-1];

else sum=st[k][j]-st[k][i-1];

if (sum>p) p=sum;

}

if (p>maxn) maxn=p;

}

   }

   printf("%d\n",maxn);

   return 0;
原文地址Q?a >http://hi.baidu.com/flymouse/blog/item/fd1378f05c7ff7c37931aac3.html


luis 2009-07-09 18:37 发表评论
]]>
字符串哈?/title><link>http://www.shnenglu.com/luyulaile/archive/2009/07/01/88990.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Wed, 01 Jul 2009 06:29:00 GMT</pubDate><guid>http://www.shnenglu.com/luyulaile/archive/2009/07/01/88990.html</guid><wfw:comment>http://www.shnenglu.com/luyulaile/comments/88990.html</wfw:comment><comments>http://www.shnenglu.com/luyulaile/archive/2009/07/01/88990.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/luyulaile/comments/commentRss/88990.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/luyulaile/services/trackbacks/88990.html</trackback:ping><description><![CDATA[<p>q是W一U哈希函敎ͼq行旉短,但内存占用多。哈希函数是怎么得到的?我也想知道。。?br>#include<stdio.h><br>#include<string.h><br>#include<math.h><br>struct abc<br>{<br>    int boo;<br>    char key[12];<br>}hash[1100005];<br>int const prime=999983;<br>double const gold=0.618033;<br>void insert(char a[],int k,int w)<br>{<br>    if(hash[w].boo==0)<br>    {    <br>        hash[w].boo=k;<br>        memcpy(hash[w].key,a,sizeof(hash[w].key));<br>    }<br>    else<br>        insert(a,k,w%prime+1);     <br>}<br>int find(int k,int w)<br>{<br>    if(hash[w].boo==k)<br>    {<br>        printf("%s\n",hash[w].key);<br>            return 1;<br>    }    <br>    else<br>    {<br>        if(hash[w].boo==0)<br>            return 0;<br>        else<br>            return find(k,w%prime+1);<br>    }    <br>}<br>int main()<br>{<br>    freopen("in.txt","r",stdin);<br>    char a[12],b[12];<br>    scanf("%c",&a[0]);<br>    while(scanf("%s%s",a+1,b))<br>    {<br>        getchar();<br>        int len=strlen(b);<br>        int k=0;<br>        for(int i=0;i<len;i++)<br>            k=k*26+b[i]-'a';<br>        int w=int (prime*(k*gold-floor(k*gold)));<br>        insert(a,k,w);<br>        scanf("%c",&a[0]);<br>        if(a[0]=='\n')<br>            break;<br>    }<br>    while(scanf("%s",&a)==1)<br>    {<br>        int len=strlen(a);<br>        int k=0;<br>        for(int i=0;i<len;i++)<br>        k=k*26+a[i]-'a';<br>        int w=int (prime*(k*gold-floor(k*gold)));<br>        if(find(k,w)==0)<br>        printf("eh\n");<br>    }<br>    return 0;<br>}<br>q是用书中提到的ELFhash()函数Q也没体现出旉上的优势Q但I间上确实是省了不少Q可能是计算ELFhash()时浪费了旉吧,处理字符串哈希冲H的办法目前只发CUŞ探测法,虽然不理惻I但愿来能发现别的办法?br>ELFhash函数在UNIXpȝV 版本4中的“可执行链接格?#8221;( Executable and Linking FormatQ即ELF )中会用到QELF文g格式用于存储可执行文件与目标文g。ELFhash函数是对字符串的散列。它对于长字W串和短字符串都很有效,字符串中每个字符?有同L作用Q它巧妙地对字符的ASCII~码D行计,ELFhash函数对于能够比较均匀地把字符串分布在散列表中?br>#include<stdio.h><br>#include<string.h><br>#include<math.h><br>#define MOD 300005<br>struct abc<br>{<br>    bool boo;<br>    char akey[12];<br>    char bkey[12];<br>}hash[300005];</p> <p>int ELFhash(char *key)<br>{ <br>    unsigned long h=0;<br>    while(*key)<br>    { <br>        h=(h<<4)+*key++;<br>        unsigned long g=h&0Xf0000000L;<br>        if(g) h^=g>>24;<br>        h&=~g;<br>    }<br>    return h%MOD;<br>}<br>void insert(char a[],char b[],int w)<br>{<br>    if(!hash[w].boo)<br>    {    <br>        hash[w].boo=true;<br>        memcpy(hash[w].akey,a,sizeof(hash[w].akey));<br>        memcpy(hash[w].bkey,b,sizeof(hash[w].bkey));<br>    }<br>    else<br>        insert(a,b,w+1);     <br>}<br>int find(char b[],int w)<br>{<br>    if(hash[w].boo && strcmp(hash[w].bkey,b)==0)<br>    {<br>        printf("%s\n",hash[w].akey);<br>            return 1;<br>    }    <br>    else<br>    {<br>        if(!hash[w].boo)<br>            return 0;<br>        else<br>            return find(b,w+1);<br>    }    <br>}<br>int main()<br>{<br>    char a[12],b[12];<br>    scanf("%c",&a[0]);<br>    while(scanf("%s%s",a+1,b))<br>    {<br>        getchar();<br>        int w=ELFhash(b);<br>        insert(a,b,w);<br>        scanf("%c",&a[0]);<br>        if(a[0]=='\n')<br>            break;<br>    }<br>    while(scanf("%s",&b)==1)<br>    {<br>        int w=ELFhash(b);<br>        if(find(b,w)==0)<br>        printf("eh\n");<br>    }<br>    return 0;<br>}</p> <p>本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/cugbliang/archive/2008/05/30/2497539.aspx</a></p> <img src ="http://www.shnenglu.com/luyulaile/aggbug/88990.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/luyulaile/" target="_blank">luis</a> 2009-07-01 14:29 <a href="http://www.shnenglu.com/luyulaile/archive/2009/07/01/88990.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>哈希?poj 3320 Jessica's Reading Problemhttp://www.shnenglu.com/luyulaile/archive/2009/07/01/88982.htmlluisluisWed, 01 Jul 2009 05:00:00 GMThttp://www.shnenglu.com/luyulaile/archive/2009/07/01/88982.htmlhttp://www.shnenglu.com/luyulaile/comments/88982.htmlhttp://www.shnenglu.com/luyulaile/archive/2009/07/01/88982.html#Feedback0http://www.shnenglu.com/luyulaile/comments/commentRss/88982.htmlhttp://www.shnenglu.com/luyulaile/services/trackbacks/88982.htmlpoj 3320 Jessica's Reading Problem http://acm.pku.edu.cn/JudgeOnline/problem?id=3320
q道题目可以用哈希表法也可以用二分查找法Q现在用哈希Q二分查扑ְ在后面的博客中推出?br>q道题目用到的是数的哈希Q对于不需要删除的字典Q哈希表是一U理想的实现方式?br>1.哈希表的插入和查扄?br>(1)计算函数值h(k)
(2)从槽h(k)开始,使用冲突解决{略定位包含关键码k的纪?br>(3)如果需要插入,再槽内插入即?br>两种操作的复杂度在忽略冲H时是O(1)
2.哈希函数的选取
本题使用最单的直接取余法,除数为PRIMEQ最好是质数Q可减小冲突?br>3.冲突解决Ҏ
开散列法(q也是大多数情况下用的Q?br>开散列法也叫拉链法Q通俗地说是“既然元素a和b都该攑֜里面Q只好挤一挤了”。即在每个槽里存放所有该攑֜里面的元素。那么怎么把很多的元素攑֜槽里呢?只在槽里放一个链表表头就行了Q该链表中包含所有该攑֜槽里的元素。但在实际中q不是这样做的,而是自己l护一个大数组Q给链表元素分配数组下标Q这h方便又节省时间和I间。那么链表中的元素的排列序怎样呢?如果按照查找成功时的效率Q显然可以按照访问的频率Q而如果按照查扑֤败的效率Q则可以按照关键值排序,即查找p|也不需要遍历整个链表。这是数据l构中的怺矛盾的两个问题,应根据实际情况协调?br>#include<stdio.h>
#define PRIME 99991
struct hashnode
{
    int key;
    int num;
    int next;
}a[1000005];
int b[1000005];
int hashl;
int hash(int num)
{
    int i;
    i=num%PRIME;
    while(a[i].next!=-1)
    {
        if(num>a[a[i].next].key)     //例如hash表中已有8Q后面又插入99999Ӟ那么99999>8,需要给99999重新分配                                                                           一个下标,即hashlQ即前面提到的开散列法解军_H?br>            break;
        else if(num==a[a[i].next].key)    //例如hash表中已有8Q后面又插入8Ӟq是只要num++
            return a[i].next;
        i=a[i].next;                               //q句用于查找Q如果哈希表中已??9999Q那么你要找8时a[8].next指向的是较大?9999Q那么你必L着nextC去,因ؓq个所谓的链表是按减小的顺序排序的。最l走到return a[i].next推出while 循环
    }
    a[hashl].key=num;
    a[hashl].next=-1;
    a[hashl].num=0;
    a[hashl].next=a[i].next;
    a[i].next=hashl;
    hashl++;                                //以上6行用于第一ơ插入元素(即while循环未执行)或while循环break退出的插入
    return hashl-1;
}

int main()
{
    int n,i,tmp,left,ans;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=0;i<PRIME;i++)
            a[i].next=-1;
        hashl=PRIME;
        left=0;
        ans=1;
        scanf("%d",&b[0]);
        tmp=hash(b[0]);
        a[tmp].num++;
        for(i=1;i<n;i++)
        {
            scanf("%d",&b[i]);
            tmp=hash(b[i]);
            a[tmp].num++;
            if(a[tmp].num<=1)     //插入的数字以前没有出现过Q肯定包含在ans?br>            {
                ans=i-left+1;
                continue;
            }                        
            while(1)                     //对应于if的else,即a[tmp].num>=2Q即插入的数字以前出现过。如果是在left位置出现q,则left右移Q如果是?#8220;left双Qi左边”出现q,则说明目前的i-left+1和ans都可以包括全部的知识点,当然取小的了Q?nbsp;  
            {
                tmp=hash(b[left]);
                if(a[tmp].num<=1)
                    break;
                a[tmp].num--;
                left++;
            }
            if(ans>i-left+1)
                ans=i-left+1;
        }
        printf("%d\n",ans);
    }
    return 0;
}


本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/cugbliang/archive/2008/06/01/2497376.aspx



luis 2009-07-01 13:00 发表评论
]]>
矛_合ƈ问题http://www.shnenglu.com/luyulaile/archive/2009/06/30/88923.htmlluisluisTue, 30 Jun 2009 12:12:00 GMThttp://www.shnenglu.com/luyulaile/archive/2009/06/30/88923.htmlhttp://www.shnenglu.com/luyulaile/comments/88923.htmlhttp://www.shnenglu.com/luyulaile/archive/2009/06/30/88923.html#Feedback0http://www.shnenglu.com/luyulaile/comments/commentRss/88923.htmlhttp://www.shnenglu.com/luyulaile/services/trackbacks/88923.html转帖
在一个圆形操场的四周摆放着n堆石子。现要将矛_有次序地合ƈ成一堆。规定每ơ只能选相ȝ2堆石子合q成新的一堆,q将新的一堆石子数Cؓ该次合ƈ的得分。试设计一个算法,计算出将n堆石子合q成一堆的最得分和最大得分?nbsp;
 
 
假设有n堆石子需要合q?可以设计一?*n-1个元素的数组来存储每堆石子的个数?
分析最优解的结构:假设有石头AiAi+1……Aj需要合q?CؓA[i,j].如果设最后一ơ合q发生在Ak与Ak+1之间(i<=k<j),则最后一个合q的得分为Ai……Aj堆石头的个数的dCؓtotalValue(i,j).(不管你最后一ơ合q发生在哪个位置,totalValue(i,j)的值都是一L)因此ȝ得分{于A[i,k]的得分加上A[k+1,j]的得分再加上totalValue(i,j).
可以假设计算A[0,n-1]的一个最优次序所包含的计子链A[0,k]和A[K+1,n-1]的次序也是最优的.
 证明:
 假设存在一个比计算A[0,k]的次序得分更的ơ序,则用此次序来替换原来计算A[0,k]的次?那么此时计算A[0,n-1]ơ序的得分就会比最优次序所得到的分数更?q与假设相矛?同理可证?计算A[0,n-1]的一个最优次序所包含的另一个计子链A[k+1,n-1]的次序也是最优的!

lg所q?此题满最优子l构性质,因此可以用动态规划算法来求解.
建立递归关系
设m[i][j]表示A[i,j]的计结?
当i=j?表示只有一堆石?不能合ƈ,因此得分为零,所以m[i,j]=0;
当i<j?可利用最优子l构性质来计m[i][j],
m[i,j]=m[i,k]+m[k+1,j]+totalValue(i,j)(i<=k<j)

可用矩阵q乘的最优计次序问题来求解q题.可选用自顶向下的备忘录法或是自底向上的动态规划算?

以下代码使用动态规划算?

void MatrixChain(int *p,int n,int **m,int flag) //矩阵q乘法
{
for(int i=0;i<n;i++)
m[i][i]=0;
for(int r=2;r<n;r++)
for(int i=0;i<n-r+1;i++)
{
int j=i+r-1;
int temp=totalValue(i,j,p);
m[i][j]=m[i+1][j]+temp;
for(int k=i+1;k<j;k++)
{
int t=m[i][k]+m[k+1][j]+temp;
if(!flag) //求最得?
{
 if(t<m[i][j])
 m[i][j]=t;
}
else //求最大得?
if(t>m[i][j])
m[i][j]=t;
}
}
}
MatrixChain(inputNum,2*n-1,m,0); //计算最得?
int resultMin=m[0][n-1];
for(i=1;i<=n-1;i++)
if(resultMin>m[i][n-1+i])
resultMin=m[i][n-1+i];

MatrixChain(inputNum,2*n-1,m,1); //计算最大得?
int resultMax=m[0][n-1];
for(i=1;i<=n-1;i++)
if(resultMax<m[i][n-1+i])
resultMax=m[i][n-1+i]; 
 
 
 


本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/lyflower/archive/2008/03/05/2150239.aspx

一Q试?br>      在一个园形操场的四周摆放N堆石子(N≤100Q,现要石子有ơ序地合q成一堆。规?br>      每次只能选相ȝ两堆合ƈ成新的一堆,q将新的一堆的矛_敎ͼCؓ该次合ƈ的得分?br>      ~一E序Q由文gd堆数N及每堆的矛_敎ͼ≤Q0Q,
      ①选择一U合q石子的ҎQ得做NQ?ơ合qӞ得分的d最;
      ②选择一U合q石子的ҎQ得做NQ?ơ合qӞ得分的d最大?br>      例如Q所C的Q堆矛_Q每堆石子数Q从最上面的一堆数P时针数Q依
      ơؓQ5Q4。则Q次合ƈ得分d最的ҎQ8Q1Q+Q2Q4Q?br>      得分最大的Ҏ为:Q4Q1Q+Q2Q5Q?br>      输入数据Q?br>      文g名由键盘输入Q该文g内容为:
      W一行ؓ矛_堆数NQ?br>      W二行ؓ每堆的石子数Q每两个C间用一个空格符分隔?br>      输出数据Q?br>      输出文g名ؓoutput.txt
      从第1至第N行ؓ得分最的合ƈҎ。第NQ?行是I。从WNQ?行到W?NQ?行是?br>      分最大合q方案?br>      每种合ƈҎ用N行表C,其中Wi行(1≤i≤NQ表C第i ơ合q前各堆的石子数Q依
      时针次序输出,哪一堆先输出均可Q?要求待合ƈ的两堆石子数以相应的负数表示Q以便标识?/font>

      输入输出范例Q?br>      输入文g内容Q?br>      Q?br>      Q?Q9 Q?br>      输出文g内容Q?br>      Q4 Q?Q?Q4
      Q8Q5 Q?br>      Q1Q?Q9
      Q2
      
      Q?Q5 Q9 Q?br>      Q?Q1Q?Q4
      Q4Q1Q?br>      Q2

      二.法分析
      竞赛中多数选手都不U而同地采用了可能D目标的贪心法来逐次合ƈQ从最上面
      的一堆开始,沉K旉方向排成一个序列?W一ơ选得分最(最大)的相M堆合qӞ
      形成新的一堆;接下来,在NQ?堆中选得分最(最大)的相M堆合q?#8230;…Q依ơ类推,
      直至所有石子经NQ?ơ合q后形成一堆?/font>

      例如有6堆石子,每堆矛_敎ͼ从最上面一堆数P时针数Q依ơؓQ?Q6 Q?Q?Q?
      要求选择一U合q石子的ҎQ得做Q次合ƈQ得分的d最?br>      按照贪心法,合ƈ的过E如下:
      每次合ƈ得分
      W一ơ合q?Q?Q?Q?Q?Q?Q?->Q?br>      W二ơ合q?Q?Q?Q?Q?Q?nbsp;   ->Q?br>      W三ơ合q?Q?Q?Q?Q?nbsp;      ->Q?br>      W四ơ合q?Q?Q?Q?nbsp;         ->Q5
      W五ơ合q?Q5 Q?nbsp;          ->Q4
      24
      d分=Q+Q+Q+Q5Q2Q=Q2

      但是当我们仔l琢后Q可得出另一个合q石子的ҎQ?br>      每次合ƈ得分
      W一ơ合q?Q?Q?Q?Q?Q?Q?nbsp; ->Q?br>      W二ơ合q?Q?Q?Q?Q?Q?nbsp;    ->Q3
      W三ơ合q?Q3 Q?Q?Q?nbsp;     ->Q?br>      W四ơ合q?Q3 Q?Q?nbsp;        ->Q1
      W五ơ合q?Q3 Q1          ->Q4
      24
      d分=Q+Q+Q1Q1Q+Q4Q6Q?br>      昄Q后者比贪心法得出的合ƈҎ更优?题目中的CZ故意造成一个贪心法解题?br>      假像Q诱使读者进?#8220;陷阱”。ؓ了帮助读者从q个“陷阱”里走出来Q?我们先来明确一个问题:

      Q.最佛_q过E符合最佛_?br>      使用贪心法至所以可能出错,
      是因为每一ơ选择得分最(最大)的相M堆合qӞ不一定保证余下的合ƈq程能导致最优解。聪明的读者马上会惛_一U理想的假设Q如果NQ?ơ合q的全局最优解包含了每一ơ合q的子问题的最优解Q那么经q样的NQ?ơ合q后的得分d必然是最优的?br>      例如上例中第五次合ƈ矛_数分别ؓQ3和1Q的盔R两堆?
      q两堆石头分别由最初的W1Q2Q3堆(矛_数分别ؓQ,Q,Q)和第Q,Q,Q堆Q石头数分别为5Q4Q2Q经Q次合ƈ后Ş成的。于是问题又归结为如何得这两个子序列的NQ?
      ơ合q的得分d最优。ؓ了实现这一目标Q我们将W1个序列又一分ؓ二:W1、2堆构成子序列Q,
      W3堆ؓ子序列2。第一ơ合q子序列Q中的两堆,得分Q;
      W二ơ再之与子序列Q的一堆合qӞ得分Q3。显然对于第Q个子序列来_q样的合q方案是最优的。同P我们第Q个子序列也一分ؓ二;W4堆ؓ子序列1Q第Q,Q堆构成子序列2。第三次合ƈ子序列2中的Q堆Q得分6Q第四次再将之与子序列1中的一堆合qӞ得分Q3。显然对于第二个子序列来_q样的合q方案也是最优的?
      由此得出一个结论──Q堆矛_l?br>      q这LQ次合ƈ后,得分的d最。我们把每一ơ合q划分ؓ阶段Q当前阶D中计算出的得分和作为状态,
      如何在前一ơ合q的基础上定义一个能使目前得分d最大的合ƈҎ作ؓ一ơ决{。很昄Q某阶段的状态给定后Q则以后各阶D늚决策不受q阶D以前各D늊态的影响?
      q种无后效性的性质W最佛_理,因此可以用动态规划的法求解?/font>

      Q.动态规划的方向和初值的讑֮
      采用动态规划求解的关键是确定所有石子堆子序列的最佛_q方案?q些矛_堆子序列包括Q?br>      {第Q堆、第Q堆}、{W2堆、第Q堆}?#8230;…、{WN堆、第Q堆};
      {第Q堆、第Q堆、第Q堆}、{W2堆、第Q堆、第Q堆}?#8230;…、{WN堆、第Q堆、第Q堆};……
      {第Q堆?#8230;…、第N堆}{第Q堆?#8230;…、第N堆、第Q堆?#8230;…{第N堆、第Q堆?#8230;…、第NQ1堆}

      Z便于q算Q我们用〔iQj〕表CZ个从Wi堆数P时针数j堆时的子序列{第i堆、第iQ1堆?#8230;…、第QiQjQ?Qmod n堆}
      它的最佛_q方案包括两个信息:
      ①在该子序列的各堆石子合q成一堆的q程中,各次合ƈ得分的dQ?br>      ②Ş成最佛_分和的子序列Q和子序列2。由于两个子序列是相ȝQ?因此只需C子序列1的堆敎ͼ
      ?br>      f〔iQj〕──子序列〔iQj〕中的j堆石子合q成一堆的最佛_分和Q?br>      c〔iQj〕──〔iQj〕一分ؓ二,其中子序列1的堆敎ͼ
      Q1≤i≤NQ1≤j≤NQ?br>      昄Q对每一堆石子来_它的
      f〔iQ1〕=Q?
      c〔iQ1〕=Q?Q1≤i≤NQ?br>      对于子序列〔iQj〕来_若求最得分dQf〔iQj〕的初始gؓ∞Q?若求最大得分dQf〔iQj〕的初始gؓQ。(Q?#8804;i≤NQ2≤j≤NQ?br>      动态规划的方向是顺?即从上而下)。先考虑含二堆石子的N个子序列Q各子序列分别从W1堆、第Q堆?#8230;…、第N堆数P时针数Q堆Q的合ƈҎ
      f〔1Q2〕,f〔2Q2〕,……Qf〔NQ2?br>      c〔1Q2〕,c〔2Q2〕,……Qc〔NQ2?br>      然后考虑含三堆石子的Q个子序列(各子序列分别从第Q堆、第Q堆?#8230;…、第Q堆数vQ顺旉敎ͼ堆)的合q方?br>      f〔1Q3〕,f〔2Q3〕,……Qf〔NQ3?br>      c〔1Q3〕,c〔2Q3〕,……Qc〔NQ3?br>      ……
      依次cLQ直臌虑了含N堆石子的N个子序列Q各子序列分别从W1堆、第Q堆?……、第N堆数P时针数N堆)的合q方?br>      f〔1QN〕,f〔2QN〕,……Qf〔NQN?br>      c〔1QN〕,c〔2QN〕,……Qc〔NQN?br>      最后,在子序列〔1QN〕,〔2QN〕,……Q〔NQN〕中Q选择得分dQf|最(或最大)的一个子序列〔iQN〕(Q?#8804;i≤NQ,由此出发倒推合ƈq程?/font>

      Q.动态规划方E和倒推合ƈq程
      对子序列〔iQj〕最后一ơ合qӞ其得分ؓWi堆数P时针数j堆的矛_Lt。被合ƈ的两堆石子是由子序列〔iQk〕和〔(iQkQ1Qmod
      nQ1QjQk〕(Q?#8804;k≤jQ1Q经有限ơ合qŞ成的。ؓ了求出最佛_q方案中的k|我们定义一个动态规划方E:
      当求最大得分d?br>      f〔iQj〕=max{f〔iQk〕+f〔xQj-k〕+t?br>      Q?#8804;k≤jQ1
      c〔iQj〕=k?f〔iQj〕=f〔iQk〕+f〔xQj-k〕+t
      Q2≤?#8804;n,Q?#8804;?#8804;n)

      当求最得分d?br>      f〔iQj〕=min{f〔iQk〕+f〔xQjQk〕+t?br>      Q?#8804;k≤jQ1
      c〔iQj〕=k?f〔iQj〕=f〔iQk〕+f〔xQj-k〕+t
      Q2≤?#8804;n,Q?#8804;?#8804;n)
      其中xQ(iQkQ1QmodnQ1Q即Wi堆数P时针数kQ1堆的堆序受?/font>

      例如对上面例子中的6(Q?Q?Q?Q?Q?Q?)堆石子,按动态规划方E顺推最得分和?依次得出含二堆石子的Q个子序列的合ƈҎ
      f〔1Q2〕=Q?f〔2Q2〕=Q0 f〔3 Q2〕=Q1
      c〔1Q2〕=Q?c〔2Q2〕=Q?c〔3Q2〕=Q?br>      f〔4Q2〕=Q?f〔5Q2〕=Q?f〔6Q2〕=Q?br>      c〔4Q2〕=Q?c〔5Q?Q〕=Q?c〔6Q2〕=Q?/font>

      含三堆石子的Q?Q?Q?Q?Q?Q?Q?)个子序列的合q方?br>      f〔1Q3〕=Q0 f〔2Q3〕=Q5 f〔3Q3〕=Q4
      c〔1Q3〕=Q?c〔2Q3〕=Q?c〔3Q3〕=Q?br>      f〔4Q3〕=Q7 f〔5Q3〕=Q4 f〔6Q3〕=Q4
      c〔4Q3〕=Q?c〔5Q3〕=Q?c〔6Q3〕=Q?/font>

      含四堆石子的Q?Q?Q?Q?Q?Q?Q?)个子序列的合q方?br>      f〔1Q4〕=Q6 f〔2Q4〕=Q8 f〔3Q4〕=Q4
      c〔1Q4〕=Q?c〔2Q4〕=Q?c〔3Q4〕=Q?br>      f〔4Q4〕=Q8 f〔5Q4〕=Q6 f〔6Q4〕=Q9
      c〔4Q4〕=Q?c〔5Q4〕=Q?c〔6Q4〕=Q?/font>

      含五堆石子的Q?Q?Q?Q?Q?Q?Q?)个子序列的合q方?br>      f〔1Q5〕=Q1 f〔2Q5〕=Q8 f〔3Q5〕=Q5
      c〔1Q5〕=Q?c〔2Q5〕=Q?c〔3Q5〕=Q?
      f〔4Q5〕=Q1 f〔5Q5〕=Q3 f〔6Q5〕=Q5
      c〔4Q5〕=Q?c〔5Q5〕=Q?c〔6Q5〕=Q?/font>

      含六堆石子的Q?Q?Q?Q?Q?Q?Q?)个子序列的合q方?br>      f〔1Q6〕=Q1 f〔2Q6〕=Q2 f〔3Q6〕=Q1
      c〔1Q6〕=Q?c〔2Q6〕=Q?c〔3Q6〕=Q?
      f〔4Q6〕=Q1 f〔5Q6〕=Q1 f〔6Q6〕=Q2
      c〔4Q6〕=Q?c〔5Q6〕=Q?c〔6Q6〕=Q?/font>

      f〔1Q6〕是f〔1Q6〕,f〔2Q6〕,……f〔6Q6〕中的最|表明最得分和是由序列〔1Q6〕经Q次合ƈ得出的。我们从q个序列出发Q?
      按下q方法倒推合ƈq程Q?br>      由c〔1Q6〕=Q可知,W5ơ合q的两堆矛_分别由子序列〔1Q3〕和子序列〔4Q?〕经Q次合ƈ后得出。其中c〔1Q3〕=Q可知由子序列〔1Q3〕合q成的一堆石子是由子序列〔1Q2〕和W三堆合q而来的。而c〔1Q2〕=Q,以表明了子序列〔1Q2〕的合ƈҎ是第Q堆合ƈW2堆?br>      由此倒推回去Q得出第Q,W2ơ合q的ҎQ每ơ合q得?
      W一ơ合q?Q?Q?Q?#8230;…    ->Q?br>      W二ơ合q?Q?Q?#8230;…          ->Q3
      Q3……
      子序列〔1Q3〕经Q次合ƈ后合q成Q堆Q?Q次合ƈ的得分和Q7Q1Q=Q0?br>      c〔4Q3〕=Q,可知由子序列〔4Q3〕合q成的一堆石子是qQ堆和子序列〔5Q?br>      Q〕合q而来的。而c〔5Q2〕=Q,又表明了子序列〔5Q2〕的合ƈҎ是第Q堆合ƈW6堆。由此倒推回去Q得出第Q、第Q次合ƈ的方?
      每次合ƈ得分Q?br>       W三ơ合q?……Q4 Q?nbsp;    ->Q?
      W四ơ合q?……Q?Q?nbsp;       ->Q1
      ……Q1
      子序列〔4Q3〕经Q次合ƈ后合q成Q堆Q2ơ合q的得分和=Q+Q1Q1Q?br>      W五ơ合q是最后两堆合q成Q堆Q该ơ合q的得分为2Q?br>      昄Q上qͼơ合q的得分d为最?br>      Q0Q1Q+Q4Q6Q?/font>

      上述倒推q程Q可׃个printQ〔子序列〕)的递归法描述
      procedure print Q〔iQj〕)
      begin
      if j〈〉1 then {l倒推合ƈq程
      begin
      printQ〔iQc〔iQj〕〕;{倒推子序列1的合q过E}
      printQ〔iQc〔iQj〕-Q〕mod nQ1QjQc〔iQj〕)
      {倒推子序列2的合q过E}
      for KQ=Q?to N do{输出当前被合ƈ的两堆石子}
      if Q第K堆石子未从圈内去除)
      then begin
      ifQKQiQorQKQXQthen|第K堆石子待合ƈ标志
      elseWK堆石子未被合qӞ
      endQ{then?br>      Wi堆石子数←Wi堆石子数Q第X堆石子数Q?br>      第X堆石子从圈内去除Q?br>      endQ{then?br>      endQ{print?br>      例如Q调用printQ〔1Q6〕)后的l果如下Q?br>                           printQ〔1Q6〕)?br>                                ┌──────┴──────?br>                     printQ〔1Q3〕)?nbsp;              printQ〔4Q3〕)?br>                ┌─────┴─────?nbsp;              ┌─────┴─────?br>          print(〔1Q2??print(?Q??     print(?Q?? print(〔5Q2??br>       ┌──────┴──────?nbsp;                        ┌──────┴──────?nbsp;            
      printQ?,1〕)        printQ?,1〕)               printQ?,1〕)        
      printQ?,1〕)
      Q图6.2-5Q?br>      其中回溯?br>      ?昄 Q?Q6 Q?Q?
      ?昄 Q?Q5 Q?Q?
      ?昄 Q3 Q4 Q?br>      ?昄 Q3Q?Q?br>      ?昄 Q3 Q1
      ?调用printq程后,应显C6堆石子的L作ؓW5ơ合q的得分?/font>

      Program Stones;
      Type
      Node = Record{当前序列的合q方案}
      c : Longint;{得分和}
      d : Byte{子序?的堆数}
      End;
      SumType = Array [1..100,1..100] of Longint;
      {sumtype[i,j]-子序列[i,j]的石子L}
      Var
      List : Array [1..100,1..100] of Node;
      {list[i,j]-子序列[i,j]的合q方案}
      Date, Dt : Array [1..100] of Integer;
      {Date[i]-Wi堆石子数,Dt-暂存Date}
      Sum : ^SumType;{sum^[i,j]-指向子序列[i,j]的石子L的指针}
      F : Text;{文g变量}
      Fn : String;{文g名串}
      N, i, j : Integer;{N-矛_堆数,i,j-循环变量}

      Procedure Print(i, j : Byte);{递归打印子序列[i,j]的合q过E}
      Var
      k, x : Shortint;{k-循环变量;x-子序?中首堆石子的序号}
      Begin
      If j <> 1 Then Begin{l箋倒推合ƈq程}
        Print(i, List[i,j].d);{倒推子序?的合q过E}
        x := (i + List[i, j].d - 1) Mod N + 1;{求子序列2中首堆石子的序号}
        Print(x, j - List[i, j].d);{倒推子序?的合q过E}
        For k := 1 to N Do{输出当前合ƈWi?Wx堆石子的Ҏ}
          If Date[k] > 0 Then Begin
             If (i= k)or(x=k)Then Write(F, - Date[k], ' ')
             Else Write(F, Date[k], ' ')
          End; { Then }
        Writeln(F);{输出换行W}
        Date[i] := Date[i] + Date[x];{原第i堆和Wx堆合q成Wi堆}
        Date[x] := - Date[x]{原Wx堆从圈内去除}
        End { Then }
      End; { Print }

      Procedure Main(s : Shortint);
      Var
        i, j, k : Integer;
        t, x : Longint;
      Begin
        For i := 1 to N Do Begin{仅含一堆石子的序列不存在合q}
          List[i, 1].c := 0;
          List[i, 1].d := 0
        End; {For}
        For j := 2 to N Do{推????#8230;…含N堆石子的各子序列的合q方案}
          For i := 1 to N Do Begin{当前考虑从第i堆数?时针数j堆的子序列}
            If s = 1 Then List[i, j].c := Maxlongint{合ƈ[i,j]子序列的得分和初始化}
             Else List[i, j].c := 0;
            t := Sum^[i, j];{最后一ơ合q的得分为[i,j]子序列的矛_L}
            For k := 1 to j - 1 Do Begin{子序?的石子堆Cơ考虑1?#8230;…j-1堆}
              x := (i + k - 1) Mod N + 1;{求子序列2首堆序号}
              If (s=1) And (List[i,k].c + List[x,j-k].c+t < List[i, j].c)
      Or (s=2) And (List[i,k].c + List[x,j-k].c+t > List[i, j].c)
      { 若该合ƈҎ为目前最?则记下}
              Then Begin
                List[i, j].c := List[i, k].c + List[x, j - k].c + t;
                List[i, j].d := k
              End { Then }
            End { For }
        End; { For }
      {在子序列[1,N],[2,N],……,[N, N]中选择得分d最?或最?的一个子序列}
        k := 1; x := List[1, N].c;
        For i := 2 to N Do
          If (s = 1) And (List[i, N].c < x) Or (s = 2) And
      (List[i, N].c > x) Then Begin
             k := i; x := List[i, N].c
          End; { Then }
        Print(k, N);{由此出发,倒推合ƈq程}
        Writeln(F, Sum^[1, N]);{输出最后一ơ将矛_合ƈ成一堆的矛_L}
        Writeln(F);
        Writeln(list[k, N].c)
      End; { Main }

      Begin
        Write('File name = ');{输入文g名串}
        Readln(Fn);
        Assign(F, Fn);{该文件名串与文g变量q接}
        Reset(F);{文gd备}
        Readln(F, N);{d矛_堆数}
        For i := 1 to N Do Read(F, Date[i]);{d每堆矛_数}
        New(Sum);{求每一个子序列的石子数sum}
        For i := 1 to N Do Sum^[i, 1] := Date[i];
        For j := 2 to N Do
          For i := 1 to N Do
            Sum^[i, j] := Date[i] + Sum^[i Mod N + 1, j - 1];
        Dt := Date;{暂存合ƈ前的各堆矛_,l构相同的变量可怺赋值}
        Close(F);{关闭输入文g}
        Assign(F, 'OUTPUT.TXT');{文g变量与输出文件名串连接}
        Rewrite(F);{文g写准备}
        Main(1);{求得分和最的合ƈҎ}
        Date := Dt;{恢复合ƈ前的各堆矛_}
        Main(2);{求得分和最大的合ƈҎ}
        Close(F){关闭输出文g}

 

本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/lyflower/archive/2008/03/05/2150251.aspx



luis 2009-06-30 20:12 发表评论
]]>
˾þô߽AVһ| þ99Ʒþþþþ| þþƷ| þùƷ99Ʒ987| ˾þ| ޹ƷƬþ| 91Ʒþþþþ91| ۺ˾þôý| þ99Ʒþþþþ| ޾ƷþëƬ| һƷþ | ۺϾþùһ鶹| 91Ʒþþþþ| ˺ݺۺϾþ88| þþþþëƬѿ| þþƷƷ| ŷպľþ| þ޹ӰԺվ| Ʒþþþþù| ޾Ʒþþþþþþþþþ| ݹƷþ| ޹˾þۺ3d| ŷ޹׾þþþþþ| ھƷþ鶹Ħ| ھƷþþӰԺ| 99þ99ֻѵľƷ| 99þùۺϾƷŮͬͼƬ| þþûƬ| þþۺϾɫۺ̾ | Ʒþ99| þۺϾþ߾Ʒ| 2021ھƷþþþþӰԺ| þݺҹҹav˳| 97þþƷˬ| ޾Ʒھþ| þer99ȾƷһ| ҹavþþþ| þþþĸ| ŷ糱þþXXXXx| AVɫۺϾþAVɫۺ| þþһƷ99þþƷ66|