這是提升組得一道動態規劃題,也是學習y氏思考法的第一道題。c++
題意爲給定一個矩陣,裏面存有一些數,你從左上角開始走到右下角,另外一我的從右下角開始走到左上角,使得兩我的取數之和最大,固然一個數只能夠取走一次而且行走規則與採花生同樣。開始以前咱們把問題進行一下轉化,把右下角的人拿到左上角來,也讓其往下走。而後咱們開始思考1.集合?從(1,1,1,1)到(i,j,i2,j2)的全部路線中的答案;2.屬性?最大值 3.集合計算與劃分?根據最後原則,除了左上角dp[i,j,i2,j2]是由上上,左左,左上,上左加上自己的數,四種狀態轉移過來的,以此得出狀態轉移方程。那麼還有一點咱們須要注意,就是咱們不能夠同時走兩個點,因此當i1=i2時,咱們只須要加上mp[i1][k-i1]的值就好4.優化?咱們只須要保持步數同樣,那麼i1,i2,k就能夠表示出j1,j2了(k-i1)。學習
代碼優化
#include<bits/stdc++.h> using namespace std; int dp[50][20][20]; int n,m; int mp[20][20]; int main(){ cin>>n; int a,b,c; memset(mp,0,sizeof(mp)); while(cin>>a>>b>>c){ mp[a][b]=c; } for(int k=2;k<=2*n;k++){ for(int i1=1;i1<=n;i1++){ for(int i2=1;i2<=n;i2++){ int j1=k-i1; int j2=k-i2; if(j1>=1&&j2>=1&&j2<=n&&j1<=n){ int t=mp[i1][j1]; if(i1!=i2) t+=mp[i2][j2]; dp[k][i1][i2]=max(dp[k-1][i1-1][i2-1]+t,dp[k][i1][i2]);//dd dp[k][i1][i2]=max(dp[k-1][i1-1][i2]+t,dp[k][i1][i2]);//dr dp[k][i1][i2]=max(dp[k-1][i1][i2-1]+t,dp[k][i1][i2]);//rd dp[k][i1][i2]=max(dp[k-1][i1][i2]+t,dp[k][i1][i2]);//rr } } } } cout<<dp[2*n][n][n]; return 0; }