百度star2014

来源:互联网 发布:java.util.base64 jar 编辑:程序博客网 时间:2024/06/04 18:06

</pre><p></p><p></p><h1 style="color:rgb(26,92,200); text-align:center; font-family:'Times New Roman'; margin-top:20px">Energy Conversion</h1><div><pre code_snippet_id="351123" snippet_file_name="blog_20140518_2_4546005" name="code" class="html">#include<stdio.h>int test(int n,int m,int v,int k){__int64 temp;int flag=0;int c_num=0;__int64 temp2;if(m>=n)return 0;if(m<0)return -1;temp=m;while(temp>=0&&(temp-v)>=0){temp2=(temp-v)*k;if(temp2==temp){break;}temp=temp2;if(temp<v)break;c_num++;if(temp>=n){flag=1;break;}}if(flag==1)return c_num;elsereturn -1;}int main(){int t;int n,m,v,k;int i;int a;while(scanf("%d",&t)!=EOF){for(i=0;i<t;i++){scanf("%d%d%d%d",&n,&m,&v,&k);a=test(n,m,v,k);printf("%d\n",a);}}}

1004  

Labyrinth

DFS会超时,下面 是会超时的dfs
#include<stdio.h>#include <string.h>int map[105][105];int best;int visited[105][105];int m,n;int move_path[3][2]={{-1,0},{1,0},{0,1}};void test_dfs(int x,int y,int ans){int i;int tempx;int tempy;if(x==0&&y==(n-1)){ans+=map[0][n-1];if(ans>best)best=ans;return ;}ans+=map[x][y];for(i=0;i<3;i++){tempx=x+move_path[i][0];tempy=y+move_path[i][1];/*x要判断是否>=0&&<m,y<n什么时候回溯*/if(tempx>=0&&tempx<m&&tempy<n&&visited[tempx][tempy]==0){visited[tempx][tempy]=1;test_dfs(tempx,tempy,ans);visited[tempx][tempy]=0;}}}int main(){int t;int i;int ans;int j,k;while(scanf("%d",&t)!=EOF){for(i=0;i<t;i++){scanf("%d%d",&m,&n);best=-100000; for(j=0;j<m;j++){ for(k=0;k<n;k++) scanf("%d",&map[j][k]); }   memset(visited,0,sizeof(visited));   visited[0][0]=1;test_dfs(0,0,0);printf("Case #%d:\n",i+1);printf("%d\n",best);           }}return 0;}

要用动态规划才能解
下面是动态规划解
#include <stdio.h>#include<stdlib.h>#include<string.h>int map[105][105];int dp[105][105];int m,n;void dp_ans(int x){int temp;for(int i=1;i<=m;i++){temp=dp[i][x-1]+map[i][x];if(temp>dp[i][x])dp[i][x]=temp;/*因为这里面跟新了dp[i][n];那么下面的也需要更新想象填表的时候,我改动一个数据因为可以上下,以及往右,往右的跟新是在下一次的时候那么上下必然要更新*/for(int j=i+1;j<=m;j++){temp+=map[j][x];if(temp>dp[j][x])dp[j][x]=temp;}}for(int i=m;i>=1;i--){temp=dp[i][x-1]+map[i][x];if(temp>dp[i][x])dp[i][x]=temp;for(int j=i-1;j>=1;j--){temp+=map[j][x];if(temp>dp[j][x])dp[j][x]=temp;}}}int main(){int t;int i;while(scanf("%d",&t)!=EOF){for(int k=0;k<t;k++){//memset(dp,-0xff,sizeof(dp));scanf("%d%d",&m,&n); for(int i=1;i<=m;i++)for(int j=1;j<=n;j++){scanf("%d",&map[i][j]);dp[i][j]=-100000000;} dp[1][1]=map[1][1]; for(int i=2;i<=m;i++) { dp[i][1]=dp[i-1][1]+map[i][1]; } for(int i=2;i<=n;i++) dp_ans(i); printf("Case #%d:\n",k+1); printf("%d\n",dp[1][n]);}}return 0;}



0 0
原创粉丝点击