題意:給出乙個蛋糕,蛋糕有兩種顏色組成,同一種顏色的可以切矩形,紅藍相間的可以切正方形。問你切出的蛋糕的最大周長
對於同一種顏色,很顯然就是最大子矩形了。用懸線法搞定
對於紅藍相間的正方形,可以用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 #include3 #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 另一題...