2011-0010

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

dp
在当前行扩展所有可能已经设置的炸弹数0..b,
对每个情况有四种状态需要计算,
1.一个都不炸
2.炸第一个
3.炸第二个
4.炸第三个
5.炸第一个和第三个

其他的情况就算炸了也不会被取到,就直接忽略了。关于题目的负数,因为没有规定炸弹一定要用完,于是负数的那个格子也肯定不会被炸到。不喜欢有负数就可以直接置0了。
关于情况有很多不必要的计算。。比如前一次炸了1,或者1,3,那么这次肯定不会炸1。具体参见我的程序

下面是我的程序

{{{
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>

using namespace std;
int dp[1001][5];
int main()
{
    int n,b,a1,a2,a3;
    while (scanf("%d%d",&n,&b) != EOF){
        memset(dp,0,sizeof dp);
        for (int i = 1; i <= n; ++i){
            scanf("%d%d%d",&a1,&a2,&a3);
            for (int j = b; j > 1; --j){
                dp[j][0] = max(dp[j-1][0],
                            max(dp[j][0],
                                max(dp[j][1],
                                    max(dp[j][2],
                                        max(dp[j][3],dp[j][4])))));
                dp[j][1] = max(dp[j-1][0],max(dp[j-1][2],dp[j-1][3])) + a1;
                dp[j][2] = max(dp[j-1][0],
                                max(dp[j-1][1],
                                    max(dp[j-1][3],dp[j-1][4]))) + a2;
                dp[j][3] = max(dp[j-1][0],
                                max(dp[j-1][1],dp[j-1][2])) + a3;
                dp[j][4] = max(max(dp[j-2][0],dp[j-2][2]) + a1 + a3,
                            max(dp[j-2][1] + a3,dp[j-2][3]+a1));
            }
            dp[1][0] = max(max(dp[1][1],dp[1][0]),max(dp[1][2],dp[1][3]));
            dp[1][1] = a1;
            dp[1][2] = a2;
            dp[1][3] = a3; 
        }
          int ans = 0;
          ans = max(max(max(dp[b][0],dp[b][1]),max(dp[b][2],dp[b][3])),dp[b][4]);
        printf("%d\n",ans);
    }
}
}}}


by 武慕邪

dp

在当前行扩展所有可能已经设置的炸弹数0..b,

对每个情况有四种状态需要计算,

1.一个都不炸

2.炸第一个

3.炸第二个

4.炸第三个

5.炸第一个和第三个

其他的情况就算炸了也不会被取到,就直接忽略了。关于题目的负数,因为没有规定炸弹一定要用完,于是负数的那个格子也肯定不会被炸到。不喜欢有负数就可以直接置0了。

关于情况有很多不必要的计算。。比如前一次炸了1,或者1,3,那么这次肯定不会炸1。具体参见我的程序

下面是我的程序

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
int dp[1001][5];
int main()
{
    int n,b,a1,a2,a3;
    while (scanf("%d%d",&n,&b) != EOF){
        memset(dp,0,sizeof dp);
        for (int i = 1; i <= n; ++i){
            scanf("%d%d%d",&a1,&a2,&a3);
            for (int j = b; j > 1; --j){
                dp[j][0] = max(dp[j-1][0],
                            max(dp[j][0],
                                max(dp[j][1],
                                    max(dp[j][2],
                                        max(dp[j][3],dp[j][4])))));
                dp[j][1] = max(dp[j-1][0],max(dp[j-1][2],dp[j-1][3])) + a1;
                dp[j][2] = max(dp[j-1][0],
                                max(dp[j-1][1],
                                    max(dp[j-1][3],dp[j-1][4]))) + a2;
                dp[j][3] = max(dp[j-1][0],
                                max(dp[j-1][1],dp[j-1][2])) + a3;
                dp[j][4] = max(max(dp[j-2][0],dp[j-2][2]) + a1 + a3,
                            max(dp[j-2][1] + a3,dp[j-2][3]+a1));
            }
            dp[1][0] = max(max(dp[1][1],dp[1][0]),max(dp[1][2],dp[1][3]));
            dp[1][1] = a1;
            dp[1][2] = a2;
            dp[1][3] = a3; 
        }
          int ans = 0;
          ans = max(max(max(dp[b][0],dp[b][1]),max(dp[b][2],dp[b][3])),dp[b][4]);
        printf("%d\n",ans);
    }
}

by 武慕邪