P1044方格取数(刷题笔记)
题目
分析
可同时处理两端路径,如果走到了相同的点,就只加数字一次。
起点到任何一个点所需的时间t=x+y-1,那么终点的t=2*n-1
阶段: 时间i,两次的纵坐标为y1,y2
状态: f[i][y1][y2]表示两个路径分别走到(i-y1+1,y1)和(i-y2+1,y2)的数字之和
决策: (四种情况:两个路径分别从左、左 || 上、左 || 左、上 ||上、上 走来)
f[i][y1][y2]=max( f[i-1][y1][y2], f[i-1][y1-1][y2], f[i-1][y1][y2-1], f[i-1][y1-1][y2-1] )+(判断是否走到了同一点,走到了同一点则加一次,不同则两个都加)
答案: f[2*n-1][n][n]
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 10;
int n,x,y,num,w[N][N],f[N*2][N][N];
int main(){
cin>>n;
while(cin>>x>>y>>num && x && y && num){
w[x][y] = num;
}
for(int i = 1;i<=2*n-1;i++){
for(int y1 = 1;y1<=i;y1++){
for(int y2 = 1;y2<=i;y2++){
int x1 = i-y1+1,x2 = i-y2+1;
f[i][y1][y2] = max({f[i-1][y1][y2],f[i-1][y1-1][y2],f[i-1][y1][y2-1],f[i-1][y1-1][y2-1]})+w[x1][y1]+(y1 == y2 ? 0 : w[x2][y2]);
}
}
}
cout<<f[2*n-1][n][n];
return 0;
}