4 611 0 7 5 13 978 4 81 6 22 41 40 9 34 16 1011 22 0 33 39 6 Sample Output242题意:如图中数字81,如果81取了,那么它上面、下面的行就不能取了,左右的也不能取了。
思路:两次dp,一次行,一次列,状态方程相同dp(i)=max(dp(i-1),dp(i-2)+tmp);
AC代码:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=2e5+10;int dpx[maxn],dpy[maxn];int main(){ int n,m; while(scanf("%d%d",&m,&n)==2){ memset(dpy,0,sizeof(dpy)); for(int i=m;i>=1;i--) { for(int j=1;j<=n;j++) {int tmp; scanf("%d",&tmp); int t=j+2; //因为j-2可能小于0所以整体向后移2 dpy[t]=max(dpy[t-1],dpy[t-2]+tmp); } dpx[i]=dpy[n+2]; } if(dpx[2]<dpx[1])dpx[2]=dpx[1]; for(int i=3;i<=m;i++) dpx[i]=max(dpx[i-1],dpx[i-2]+dpx[i]); printf("%d/n",dpx[m]); } return 0;}
新闻热点
疑难解答