Mastermate官网 香港|英国|新加坡|澳大利亚|澳门|深圳硕士研究生申请平台

usc week 4 DP 2012-4-18日 队内练习赛

  果断的悲剧,现在还距比赛结束还有两天,对dp果然是不太擅长,利用这场比赛多练习下~~~~

http://openoj.awaysoft.com:8080/judge/contest/view.action?cid=172#problem/A

max sum 过的题竟然wa了三次~~~

果断悲剧~~

贴下代码~~

#include<stdio.h>
int main()
{
  int i,n,len,start,end,beg,over,m=0;
  int sum,ji,num;
  scanf("%d",&n);
  while(n--)
  { 
  scanf("%d",&len);
  ji=0;sum=-200000000;start=1;end=1;beg=1;over=1;            //注意sum的初值~~~
  m++;
   for(i=1;i<=len;i++)
    { 
    scanf("%d",&num);
    ji+=num;over=i;
    if(ji>sum){sum=ji;start=beg;end=over;}
    if(ji<0){ji=0;beg=over=i+1;}                  
    }
  printf("Case %d:\n",m);  
  printf("%d %d %d\n",sum,start,end);
  if(n!=0)printf("\n");
  }
}

这题的时间复杂度是O(n)吧~~一遍过~~~~主要是注意开始的付初值~是负值~~没注意~~囧~~~


第二题 树塔~~~这题典型的动态规划~~保留原步骤的最优值即可求出来~~~
注意的是到了第四行就出现了选择~~看应该是两个值的哪个值应该放在~下一行,进行一下选择
贴代码~~

#include<stdio.h>
int main()
{
int n,len,a[102][102],i,j,max;
scanf("%d",&n);
while(n--){
scanf("%d",&len);
for(i=1;i<=len;i++)
{
for(j=1;j<=i;j++)
scanf("%d",&a[i][j]);
}
for(i=1;i<len;i++)
{
a[i+1][1]+=a[i][1];                                               // 开头和结尾可以直接加就可以喽~~~
a[i+1][i+1]+=a[i][i];
for(j=1;j<=i-1;j++)
{
if(a[i][j]>a[i][j+1])a[i+1][j+1]+=a[i][j];                 //这就是选择的部分
else a[i+1][j+1]+=a[i][j+1];
}
}
max=a[i][1];                                                    //结果都出来了,就选最值呗~
for(j=2;j<=i;j++)
if(max<a[i][j])max=a[i][j];
printf("%d\n",max);

}
}

2012-4-20日

比赛结束了

有写了两道题

一道是hdoj的super jumping jumping jumping!

这道题果断是看别人的思路写上去的;

是关于求最大子序列的值

贴上解题代码

#include<stdio.h>
int main()
{
int n,a[1010],b[1010],i,max,j;
while(scanf("%d",&n)&&n!=0){
  scanf("%d",&a[0]);
  b[0]=a[0];
  for(i=1;i<n;i++){
     scanf("%d",&a[i]);
     b[i]=a[i];
     for(j=0;j<i;j++){
       if(a[j]<a[i]&&b[j]+a[i]>b[i])
       b[i]=b[j]+a[i];                                     
                     }              
                   }  
    max=b[0];
    for(i=1;i<n;i++)
    if(max<b[i])max=b[i];
    printf("%d\n",max);                                               
                            }
}

 

还有一道是  hdoj 的跳舞毯问题  

#include<stdio.h>
int main()
{
int a[1010][2],i,n;
a[1][0]=a[1][1]=0;
a[2][0]=0;
a[2][1]=2;
for(i=3;i<=1001;i++){
     a[i][0]=a[i-1][1];
     a[i][1]=a[i-1][0]*2+a[i-1][1];
            a[i][0]%=10000;
            a[i][1]%=10000;                           
      
                  }
   while(scanf("%d",&n)&&n!=0)
   printf("%d\n",a[n][1]);                               
                
}


这个问题 自己了解了一方面 (a+b)%c= (a%c+b%c)%c

这个最近又ac了一道dp的基础问题 ,两线段的交点,当时自己好像用到了陈星老师讲的 哈希表的一些特性 + DP 注意要找状态转移方程

贴代码

http://openoj.awaysoft.com:8080/judge/contest/view.action?cid=172#problem/B
#include<stdio.h>
#include<string.h>
int main()
{
int a[21][200],i,j,k,n;    
memset(a,0,sizeof(a));
 a[0][0]=1;
 a[1][0]=1;
 a[2][0]=1;
 a[2][1]=1;
     for(i=3;i<=20;i++)
     for(k=i-1;k>=0;k--)
     for(j=0;j<=k*(k-1)/2;j++)
     if(a[k][j]==1)a[i][(i-k)*k+j]=1;
     while(scanf("%d",&n)!=EOF)
     {for(i=0;i<=n*(n-1)/2;i++){
     if(i==0){printf("0");continue;}
     if(a[n][i]==1)printf(" %d",i);}
     printf("\n");
     }
}

 

 


posted @ 2012-04-18 23:21  大嘴鸟  阅读(185)  评论(0编辑  收藏  举报
Mastermate官网 香港|英国|新加坡|澳大利亚|澳门|深圳硕士研究生申请平台