hdu 4328 極大子矩形加正方形DP

2022-04-11 17:22:42 字數 1629 閱讀 5990

題意:給出乙個蛋糕,蛋糕有兩種顏色組成,同一種顏色的可以切矩形,紅藍相間的可以切正方形。問你切出的蛋糕的最大周長

對於同一種顏色,很顯然就是最大子矩形了。用懸線法搞定

對於紅藍相間的正方形,可以用dp解決。

定義dp[i][j]表示,以i,j為正方形右下角點的時候的最大邊長。顯然dp[i][j]=min(dp[i-1][j],dp[i][j-1])+1,但是有乙個前提,那就是

map[i][j]!=map[i-1][j] && map[i][j]!=map[i][j-1]

另外還需要注意一點就是,對角線上的元素必須是相同的。比如

bbbr 如果不注意判斷對角線的元素,那麼正方形會得出2*2

view code

1 #include2 #include

3 #include4

using

namespace

std;56

char v[1002][1002];7

int h[1002],l[1002],r[1002

],lm,rm;

8int

n,m;910

int get_rectange(char c) //

懸線法11

18for(i=1;i<=n;i++)

1929

else

3036

}37 rm=m;

38for(j=m;j>=1;j--)

3948

else

49 rm=j-1;50

}51}52

return

ans;53}

5455

int dp[1002][1002

];56

57int min(int a,int

b)58

6162

intdp()

6379

if(dp[i][j]*4>ans)

80 ans=dp[i][j]*4;81

}82}83

return

ans;84}

8586

intmain()

87101

}102 ansr=get_rectange('r'

);103 ansb=get_rectange('b'

);104

for(i=1;i<=m;i++)

105 v[0][i]='*'

;106

for(i=0;i<=n;i++)

107 v[i][0]=v[i][m+1]='*'

;108 ansc=dp();

109if(ansr>ansc)

110 ansc=ansr;

111if(ansb>ansc)

112 ansc=ansb;

113 printf("

case #%d: %d\n

",o++,ansc);

114}

115return0;

116 }

hdu1285 hdu4857 拓撲排序

一 原題內容 problem description 有n個比賽隊 1 n 500 編號依次為1,2,3,n進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從前往後依次排名,但現在裁判委員會不能直接獲得每個隊的比賽成績,只知道每場比賽的結果,即p1贏p2,用p1,p2表示,排名時p1在p2之前。現在...

樹狀陣列 hdu2689 hdu2838

題意 給定乙個正整數n,和乙個1 n的乙個排列,每個數可以和旁邊的兩個數的任意乙個交換,每交換一次總次數就要加一,問將這個排列轉換成乙個遞增的排列需要多少次交換?題意可以轉換成求這個排列的逆序對數。include include include include using namespace std...

hdu2068 hdu 2049 錯排組合

這部分涉及的知識為組合數和錯排 參考 比較簡單 hdu2068 include include int64 c int n,int m 組合數公式 return u d main sum for i 3 i 13 i f i i 1 f i 1 f i 2 while scanf d n n 另一題...