Quicksum POJ 3094
非常水:
1 #include<iostream> 2 #include<algorithm> 3 #include<stdio.h> 4 #include<string.h> 5 #include<string> 6 using namespace std; 7 int main() 8 { 9 char a[260]; 10 int n,sum,i; 11 while(3) 12 { 13 gets(a+1); 14 if(a[1]=='#') 15 break; 16 n=strlen(a+1); 17 sum=0; 18 for(i=1;i<=n;i++) 19 { 20 if(a[i]<'A'||a[i]>'Z') 21 continue; 22 else 23 { 24 sum+=i*(a[i]-'A'+1); 25 } 26 } 27 printf("%d ",sum); 28 } 29 return 0; 30 }
连连看 HDU 1175
终于有感觉了!!!
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<string.h> 5 using namespace std; 6 int b[4][2]={0,1,0,-1,1,0,-1,0}; 7 int a[1005][1005],c1[1005][1005],t,flag,n,m,x2,y2; 8 void dfs(int x,int y,int z) 9 { 10 int i,z1,x1,y1; 11 if(x==x2&&y==y2&&t<=2) 12 { 13 flag=1; 14 return ; 15 } 16 if(t==2) 17 { 18 if(x-x2!=0&&y-y2!=0) 19 return ; 20 if(x-x2==0&&y-y2!=0&&z!=-1) 21 return ; 22 if(x-x2!=0&&y-y2==0&&z!=1) 23 return ; 24 }//此处剪枝最重要!不然就会超时!! 25 if(t>=3) 26 return ; 27 if(flag) 28 return ; 29 for(i=0;i<4;i++) 30 { 31 x1=x+b[i][0]; 32 y1=y+b[i][1]; 33 if(x1-x!=0) 34 z1=1; 35 if(y1-y!=0) 36 z1=-1; 37 if(x1>=1&&x1<=n&&y1>=1&&y1<=m&&!c1[x1][y1]&&(a[x1][y1]==0||x1==x2&&y1==y2))//还要注意重点不为零要格外地判断 38 { 39 c1[x1][y1]=1; 40 if(z1!=z&&z!=0) 41 t++; 42 dfs(x1,y1,z1); 43 c1[x1][y1]=0; 44 if(z1!=z&&z!=0) 45 t--;//此处进行了回溯! 46 } 47 } 48 } 49 int main() 50 { 51 int i,j,x1,y1,t1; 52 while(scanf("%d%d",&n,&m)!=EOF) 53 { 54 if(n==0&&m==0) 55 break; 56 memset(c1,0,sizeof(c1)); 57 for(i=1;i<=n;i++) 58 for(j=1;j<=m;j++) 59 { 60 scanf("%d",&a[i][j]); 61 if(a[i][j]!=0) 62 c1[i][j]=1; 63 } 64 scanf("%d",&t1); 65 while(t1--) 66 { 67 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 68 if(a[x1][y1]!=a[x2][y2]) 69 { 70 printf("NO "); 71 continue; 72 } 73 if(a[x1][y1]==0||a[x2][y2]==0) 74 { 75 printf("NO "); 76 continue; 77 } 78 flag=0;t=0;c1[x2][y2]=0; 79 dfs(x1,y1,0); 80 c1[x2][y2]=1; 81 if(flag==0) 82 printf("NO "); 83 else 84 printf("YES "); 85 } 86 } 87 return 0; 88 }//Z用来判断是否拐弯的
非常水的背包问题:
1 #include<iostream> 2 #include<algorithm> 3 #include<stdio.h> 4 #include<string.h> 5 using namespace std; 6 int main() 7 { 8 int a[1005],b[1005]; 9 int c[10005]; 10 int t,i,j,n,m; 11 scanf("%d",&t); 12 while(t--) 13 { 14 scanf("%d%d",&n,&m); 15 for(i=1;i<=n;i++) 16 scanf("%d",&a[i]); 17 for(j=1;j<=n;j++) 18 scanf("%d",&b[j]); 19 memset(c,0,sizeof(c)); 20 for(i=1;i<=n;i++) 21 { 22 for(j=m;j>=b[i];j--) 23 { 24 if(c[j]<c[j-b[i]]+a[i]) 25 c[j]=c[j-b[i]]+a[i]; 26 } 27 } 28 printf("%d ",c[m]); 29 } 30 return 0; 31 }
龟兔赛跑 HDU 2059
一道动态规划题目:重点找到状态转移方程!
看到解释就很好懂了,属于那种爆发型的。。。
定义状态dp[i]表示的是乌龟到第i个加油站时花费的最短时间。
那么dp[i] = min(dp[i],dp[j]+time);其中j < i且time是
在j加油后走到i所花的时间。意思就是,从0~j这些加油站中,选
择哪个来加油才能使去到i的时间最短。所以时间复杂度是O(n^2)。
不过值得注意的细节时,把起点和终点也当成加油站,上述的0就是
指起点。其中起点是是不用花时间的加油站。
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 using namespace std; 5 int main() 6 { 7 int L,n,c,t,v,v1,v2,a[105],i,j; 8 double d,dp[105],temp; 9 while(~scanf("%d",&L)) 10 { 11 scanf("%d%d%d",&n,&c,&t); 12 scanf("%d%d%d",&v,&v1,&v2); 13 for(i=1;i<=n;i++) 14 scanf("%d",&a[i]); 15 a[0]=0; 16 a[n+1]=L; 17 for(i=1;i<=n+1;i++) 18 dp[i]=10000005; 19 dp[0]=0; 20 d=L*1.0/v;//没有(*1.0)会错的。。。(double与int的转化) 21 for(i=1;i<=n+1;i++) 22 { 23 for(j=0;j<i;j++) 24 { 25 if(a[i]-a[j]<=c) 26 temp=(a[i]-a[j])*1.0/v1+t; 27 else 28 temp=c*1.0/v1+t+(a[i]-a[j]-c)*1.0/v2; 29 if(!j) 30 temp-=t;//起点不算加速时间! 31 dp[i]=min(dp[i],dp[j]+temp); 32 } 33 } 34 if(dp[n+1]<d) 35 printf("What a pity rabbit! "); 36 else 37 printf("Good job,rabbit! "); 38 } 39 return 0; 40 }