还是一道不错的dp题
但洛谷上的大佬们都用的四维dp
而我用的是两次二维dp
其实也能过
但好像仅限于这题,大家还是去学学四维dp,本题解仅限于新手
好了说一下思路
题里说只能往下和往右走,那么我们能得到dp方程
d[i][j]=max(d[i-1][j],d[i][j-1])+a[i][j];
一个点d[i][j]最大值是它上面的点和左边的点的max加上它自己
然后我们要用dfs删点(详细注解见代码)
删完之后再跑一遍dp方程
最后输出两次之和就行了
代码
#include<cstdio>
#include<algorithm>
using namespace std;
int n,aa[10][10],d[10][10],p[10][10];
void shandian(int a)//删点
{
if(a==0)//减没了就return
{
return;
}
for(int i=1;i<=n;i++)
{
int flag=0;//标记
for(int j=1;j<=n;j++)
{
if(d[i][j]==a)//如果当前值等与a
{
int ddd=d[i][j]-aa[i][j];//减去
aa[i][j]=0;//用过的点赋为0
shandian(ddd);
flag=1;
break;//如果不break会死循环
}
}
if(flag==1)
break;//如果不break会死循环
}
}
int main()
{
scanf("%d",&n);
int u=1,v=1,w=1;
while(u!=0&&v!=0&&w!=0)//输入
{
scanf("%d%d%d",&u,&v,&w);
aa[u][v]=w;
}
for(int i=1;i<=n;i++)//第一遍
{
for(int j=1;j<=n;j++)
{
d[i][j]=max(d[i-1][j],d[i][j-1])+aa[i][j];//dp式
}
}
shandian(d[n][n]);//删掉第一遍用过的点
for(int i=1;i<=n;i++)//第二遍
{
for(int j=1;j<=n;j++)
{
p[i][j]=max(p[i-1][j],p[i][j-1])+aa[i][j];//同上
}
}
printf("%d",d[n][n]+p[n][n]);
return 0;
}
希望对大家有用哦