百度star2014

</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;
	else
		return -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;
}

点赞