生活随笔
收集整理的這篇文章主要介紹了
寻宝游戏(DFS+动态规划)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
小明有一張藏寶圖,上面有m*n個房間,每個房間里面都有一個有一定價值的寶物,小明只能從左上角的房間進入收集寶物,且每次只能向右邊或向下邊的房間繼續尋寶,最終只能從最右下的房間出來。請你幫小明計算下他最多可以收集到多少價值的寶物?
?輸入格式:
輸入第一行給出兩個正整數m,n(1=<m,n<=2000),隨后給出m行數據,每行都包括n個正整數,中間用空格分割。
輸出格式:
輸出收集到的最大價值v,題目保證v<10^9。
輸入樣例:
4 4
1 18 9 3
7 10 6 12
5 13 4 15
2 11 8 16
輸出樣例:
78
?參考代碼:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<bits/stdc++.h>
#include<string.h>
#include<vector>
#include<unordered_map>
#include<set>using namespace std;
vector<vector<int>>arr(100);
vector<vector<int>>dp(100);int main(void){
int m,n;
cin>>m>>n;
for(int i=0;i<=m;i++){arr[i].resize(n+1);dp[i].resize(n+1);
}
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>arr[i][j];dp[1][1]=arr[1][1];for(int i=2;i<=n;i++){dp[1][i]=arr[1][i]+dp[1][i-1];dp[i][1]=arr[i][1]+dp[i-1][1];
}
for(int i=2;i<=m;i++){for(int j=2;j<=n;j++){dp[i][j]=arr[i][j]+max(dp[i][j-1],dp[i-1][j]);}
}
cout<<dp[m][n]<<endl;}
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<bits/stdc++.h>
#include<string.h>
#include<vector>
#include<unordered_map>
#include<set>using namespace std;
vector<int>dp(100,0);
vector<vector<int>>arr(100);int main(void){
int m,n;
cin>>m>>n;
for(int i=0;i<=m;i++)
arr[i].resize(n+1,0);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)cin>>arr[i][j];
//初始化
dp[1]=arr[1][1];
for(int i=2;i<=n;i++)
dp[i]=arr[1][i]+dp[i-1];//遍歷
for(int i=2;i<=m;i++){dp[1]+=arr[i][1];for(int j=2;j<=n;j++)dp[j]=arr[i][j]+max(dp[j],dp[j-1]);
}
cout<<dp[n]<<endl;
}
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<bits/stdc++.h>
#include<string.h>
#include<vector>
#include<unordered_map>
#include<set>using namespace std;vector<vector<int>>arr(100);
int a[2][2]={{0,1},{1,0}};
int d[100][100];
int m,n;
void dfs(int i,int j,int c){if(c+arr[i][j]<d[i][j])return ;d[i][j]=c+arr[i][j];if(i==m&&j==n) return;int temp=d[i][j];i=i+a[0][0];j=j+a[0][1];if(i<=m&&j<=n)dfs(i,j,temp);i=i-a[0][0];j=j-a[0][1];i=i+a[1][0];j=j+a[1][1];if(i<=m&&j<=n)dfs(i,j,temp);i=i-a[1][0];j=j-a[1][1];
}
int main(void){
cin>>m>>n;
for(int i=0;i<=m;i++)
arr[i].resize(n+1,0);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)cin>>arr[i][j];dfs(1,1,0);
cout<<d[m][n]<<endl;}
?
?
?
總結
以上是生活随笔為你收集整理的寻宝游戏(DFS+动态规划)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。