BZOJ 1084 [SCOI2005]最大子矩陣 - DP

一開始被這道題嚇到了,k個是什麼操作。。。
然後看到數據範圍。。。發現就是一道暴力討論題(當然我是這麼想的)
m=1很簡單
對於m=2,每行設了5個狀態:
0:此行不選
1:只選左邊格子
2:只選右邊格子
3:左右均選,且左右均與其上下構成矩形
4:左右均選,且左右橫着構成矩形

噁心死我了,是怎樣的一種勇氣支持我寫完的它,還在WA了無數次之後依然堅持調試。。。

然後暴力討論。。。注意賦初值要小心!!!

其實還有一個複雜度不是很優的做法,但是對於兩個物品的這種dp,一般都要考慮到設dp i j將兩種狀態一起轉移討論,類似於行進
鏈接:http://www.cnblogs.com/ljh2000-jump/p/5793708.html

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>

using namespace std;

const int maxn=105;

int n,m,k,ans;
int s[maxn][2],dp[maxn][5][maxn];

void solve1()
{
    for(int i=1;i<=n;i++)
        scanf("%d",&s[i][0]);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=k;j++)
            dp[i][0][j]=max(dp[i-1][1][j],dp[i-1][0][j]),
            dp[i][1][j]=max(dp[i-1][0][j-1],dp[i-1][1][j])+s[i][0];
    }
    cout<<max(dp[n][0][k],dp[n][1][k]);
}
void solve2()
{
    for(int i=1;i<=n;i++)
        scanf("%d%d",&s[i][0],&s[i][1]);
    memset(dp,-0x3f,sizeof dp);
    dp[0][0][0]=dp[0][1][1]=dp[0][2][1]=dp[0][3][2]=dp[0][4][1]=0;
    for(int i=1;i<=n;i++)
    {
        dp[i][0][0]=dp[i][1][1]=dp[i][2][1]=dp[i][3][2]=dp[i][4][1]=0;
        for(int j=1;j<=k;j++)
            dp[i][0][j]=max(dp[i-1][0][j],max(dp[i-1][1][j],max(dp[i-1][2][j],max(dp[i-1][3][j],dp[i-1][4][j])))),
            dp[i][1][j]=max(max(dp[i-1][0][j-1],max(dp[i-1][2][j-1],dp[i-1][4][j-1])),max(dp[i-1][1][j],dp[i-1][3][j]))+s[i][0],
            dp[i][2][j]=max(max(dp[i-1][0][j-1],max(dp[i-1][1][j-1],dp[i-1][4][j-1])),max(dp[i-1][2][j],dp[i-1][3][j]))+s[i][1],
            dp[i][3][j]=max(j>=2?max(dp[i-1][0][j-2],dp[i-1][4][j-2]):-0x3f3f3f3f,max(max(dp[i-1][1][j-1],dp[i-1][2][j-1]),dp[i-1][3][j]))+s[i][0]+s[i][1],
            dp[i][4][j]=max(dp[i-1][4][j],max(dp[i-1][0][j-1],max(dp[i-1][1][j-1],max(dp[i-1][2][j-1],dp[i-1][3][j-1]))))+s[i][0]+s[i][1];

    }
    cout<<max(dp[n][1][k],max(dp[n][2][k],max(dp[n][3][k],max(dp[n][4][k],dp[n][0][k]))));
}
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    if(m==1)
        solve1();
    else 
        solve2();
    return 0;
}

(woc這代碼在博客上顯示怎麼變得更噁心了。。。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章