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