??xml version="1.0" encoding="utf-8" standalone="yes"?>
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>
长春赢鼎教育公司长春赢鼎教育公司 原是传销机构!
]]>
]]>
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);
}
}
}
]]>
quickPassQueue.add();在末添加元?br />----演示E序-----
import java.util.*;
import java.io.*;
public class test
{
Vector v = new Vector();
public void testMethod(){
v.add("a");
v.add("b");
v.add("c");
System.out.println("\n原来的vecotr");
for(int i=0;i<v.size();i++){
System.out.println("\n"+" index is: "+ i + " element is: " +v.get(i));
}
v.remove(0);
System.out.println("\nL一个vector中第一个元?);
for(int i=0;i<v.size();i++){
System.out.println("\n"+" index is: "+ i + " element is: " +v.get(i));
}
}
public static void main(String[] args)
{
test t = new test();
t.testMethod();
System.out.println("Hello World!");
}
}
-----------------排序E序------------------------------
import java.util.*;
class MyCompare implements Comparator //实现ComparatorQ定义自q比较Ҏ
{
public int compare(Object o1, Object o2) {
Elem e1=(Elem)o1;
Elem e2=(Elem)o2;
if(e1.get() > e2.get())//q样比较是降?如果?1Ҏ1是升序.
{
return -1;
}
else if(e1.get()<e2.get())
{
return 1;
}
else
{
return 0;
}
}
}
class Elem {
private int iVal;
public Elem(int i) {
this.iVal = i;
}
public int get() {
return this.iVal;
}
}
public class Vector1 {
public static void main(String[] args) {
List v = new Vector();
v.add(new Elem(1));
v.add(new Elem(22));
v.add(new Elem(3));
v.add(new Elem(14));
Comparator ct = new MyCompare();
Collections.sort(v, ct);
for (int i = 0; i < v.size(); i++)
System.out.println(((Elem) v.get(i)).get());
}
}
import java.util.*; |
在本例中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.*; |
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 { |
在此代码样例中潜伏着一个错误。如果此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 { |
deposit() ?/span> withdraw() 函数都需要这个锁来进行操作,所以当一个函数运行时Q另一个函数就被阻塞。请注意Q?/span> checkBalance() 未作更改Q它严格是一个读函数。因?/span> checkBalance() 未作同步处理Q所以Q何其他方法都不会d它,它也不会dM其他ҎQ不那些方法是否进行了同步处理
题目大意:
原文地址Q?a >http://hi.baidu.com/flymouse/blog/item/fd1378f05c7ff7c37931aac3.htmld一个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; |
int ELFhash(char *key)
{
unsigned long h=0;
while(*key)
{
h=(h<<4)+*key++;
unsigned long g=h&0Xf0000000L;
if(g) h^=g>>24;
h&=~g;
}
return h%MOD;
}
void insert(char a[],char b[],int w)
{
if(!hash[w].boo)
{
hash[w].boo=true;
memcpy(hash[w].akey,a,sizeof(hash[w].akey));
memcpy(hash[w].bkey,b,sizeof(hash[w].bkey));
}
else
insert(a,b,w+1);
}
int find(char b[],int w)
{
if(hash[w].boo && strcmp(hash[w].bkey,b)==0)
{
printf("%s\n",hash[w].akey);
return 1;
}
else
{
if(!hash[w].boo)
return 0;
else
return find(b,w+1);
}
}
int main()
{
char a[12],b[12];
scanf("%c",&a[0]);
while(scanf("%s%s",a+1,b))
{
getchar();
int w=ELFhash(b);
insert(a,b,w);
scanf("%c",&a[0]);
if(a[0]=='\n')
break;
}
while(scanf("%s",&b)==1)
{
int w=ELFhash(b);
if(find(b,w)==0)
printf("eh\n");
}
return 0;
}
本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/cugbliang/archive/2008/05/30/2497539.aspx
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
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