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