計蒜客 雙人遊戲 dp

2021-09-10 06:05:38 字數 1218 閱讀 6427

題目鏈結 

題解: 這道題想了半天沒想到好的方法,看了答案的**後才恍然大悟。

從左上角和右上角出發最終會形成2條路徑,這2條路徑肯定是相交的。要使積分和最大,交點肯定只有1個(解此題的關鍵所在)。

理由: 假設2條路徑已經交於1點了,由於一條路只能往右(下)發展,另一條路只能往左(下)發展,所以如果有多個交點的話,這多個交點必定是連續的。然後2條路繼續擴張,擴張來達到新的點,即2條路不再相交的地方,這時,對於其中一條路來講,要達到此時新的一點,既可以走剛才那條有幾個交點的路,也可以走交點旁邊空白的路再到達此時的點,這樣能獲得更多積分。(感覺說得不太清楚,只要能理解到只能有1個交點這題就迎刃而解了)

#include #include #include #define maxn 550

using namespace std;

int dp1[maxn][maxn],dp2[maxn][maxn],dp3[maxn][maxn],dp4[maxn][maxn];

int a[maxn][maxn];

int n,m;

int main()

// 朝右下角走

for(int i = n;i >= 1;i--)

for(int j = m;j >= 1;j--)

// 朝左上角走

for(int i = 1;i <= n;i++)

for(int j = 1;j <= m;j++)

// 朝左下角走

for(int i = n;i >= 1;i--)

for(int j = 1;j <= m;j++)

// 朝右上角走

for(int i = 1;i <= n;i++)

for(int j = m;j >= 1;j--)

int res = 0;

for(int i = 2;i < n;i++)

for(int j = 2;j < m;j++)

printf("%d\n",res);

return 0;

}

計蒜客 跳躍遊戲2(dp)

給定乙個非負整數陣列,假定你的初始位置為陣列第乙個下標。陣列中的每個元素代表你在那個位置能夠跳躍的最大長度。你的目標是到達最後乙個下標,並且使用最少的跳躍次數。例如 a 2,3,1,1,4 a 2,3 1,1 4 到達最後乙個下標的最少跳躍次數為 2 2。先跳躍 1 1 步,從下標 0 0 到 1 ...

計蒜客 逃生dp

蒜頭君在玩一款逃生的遊戲。在乙個 n m 的矩形地圖上,蒜頭位於其中乙個點。地圖上每個格仔有加血的藥劑,和掉血的火焰,藥劑的藥效不同,火焰的大小也不同,每個格仔上有乙個數字,如果格仔上的數字是正數說明是乙個藥劑代表增加的生命值,如果是負數說明是火焰代表失去的生命值。蒜頭初始化有 v 點血量,他的血量...

計蒜客 乘法遊戲

乘法遊戲是在一行牌上進行的。每一張牌包括了乙個正整數。在每乙個移動中,玩家拿出一張牌,得分是用它的數字乘以它左邊和右邊的數,所以不允許拿第1張和最後1張牌。最後一次移動後,這裡只剩下兩張牌。你的目標是使得分的和最小。例如,如果數是10 1 50 20 5,依次拿1 20 50,總分是10 1 50 ...