題目鏈結
題解: 這道題想了半天沒想到好的方法,看了答案的**後才恍然大悟。從左上角和右上角出發最終會形成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 ...