dp1[i][j]表示从当前位置(i,j)开始,且此时不存在取反操作时获得的最大积分,也就是进入(i,j)时没有取反这个命令,但之后可能遇到0而取反,但是这不关(i,j)的事,因为之后无论何时遇到0,都属于(i,j)位置不取反的情况,即使(i,j)为0也符合这种情况。 同理dp2[i][j]表示从(i,j)开始,此时存在取反操作。 #include <iostream> #include <vector> using namespace std; int main() {     int n;     int w[n][3];     for(int i=0;i<n;i++)         cin>>w[i][0]>>w[i][1]>>w[i][2];     int dp1[n][3], dp2[n][3];     memset(dp1, 0,sizeof(dp1));     memset(dp2, 0, sizeof(dp2));     for(int i=0;i<3;i++){         dp1[n-1][i]=w[n-1][i];         dp2[n-1][i]=-w[n-1][i];     }     for(int i=n-2;i>=0;i--){         for(int j=0;j<3;j++){             int h1 =INT_MIN, h2=INT_MIN;             for(k=max(0,j-1);k<=min(2,j+1);k++){                 if(w[i][j]){                     dp1[i][j] =max(h1, w[i][j]+dp1[i+1][k]);                     dp2[i][j] =max(h2, -w[i][j]+dp2[i+1][k]);                 }else{                     dp1[i][j] =max(h1, dp2[i+1][k]);                     dp2[i][j] =max(h2, dp1[i+1][k]);                 }             }         }     }     int res=INT_MIN;     for(int i=0;i<3;i++){         res=max(res,dp1[0][i]);     }     cout<<res; } 没测试哈~
点赞 评论

相关推荐

牛客网
牛客网在线编程
牛客网题解
牛客企业服务