国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

BZOJ 3997 [TJOI2015]組合數學

2019-11-08 02:38:55
字體:
來源:轉載
供稿:網友

最大點獨立集+DP

答案就是在圖中選出一些點,使得兩兩不可達且權值和最大。

然而并沒有找到證明,于是只好自己腦補。大概是會證(口)明(胡)了吧……現給出我的證明如下:

先分析出行進的策略:走到第一行最右的一個非零格子,向下走一行進入第二行,走到右邊最右的一個非零格子(若無則不走),向下走一行進入第三行,走到右邊最右的一個非零格子(若無則不走) ……走到右下角。

證明:易知選出的點集中最右上的(稱作x)那個一定在第一遍的行進路上。只需證明當x的權值減完之后,點集S中除x以外的最右上的點(稱作y)在接下來的行進路上,即可說明存在這樣一種方案。

首先,顯然x,y圍成的矩形內(不含邊界)中不可能有點,否則加入點集更優。假設y無法進入當前行進路,即y的右上角還有點,設為u。易知這個點不會在x的右上方,否則就不會輪到x。這個點只能在[y的右上]與[x的左上或右下] 的交集之中。此時用u替換x,點集S權值更優。但可能導致u和x的前一個點集中的右上的點無法銜接,即變得可達。設x的前一個點集中的右上點為z。如果z一直都在消u,則把z也丟掉即可。如果z消u之前在消v(即v,u不可達,v不屬于點集S),則用v,u共同替換x,z答案更優,此時繼續遞歸尋找z的右上點,變成子問題。點集S中最右上的點沒有右上點,因此子問題可以結束,即可以找到最優解。

可能你看不懂我在說什么,建議把圖畫出來比一比,那樣應該就知道了QAQ

#include<cstdio>#include<cstring>#include<algorithm>#define N 1005 using namespace std;namespace runzhe2000{ int f[N][N], a[N][N]; void main() { int T; scanf("%d",&T); for(; T--;) { int n, m; scanf("%d%d",&n,&m); memset(f,0,sizeof f); for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) scanf("%d",&a[i][j]); for(int i = 1; i <= n; i++) for(int j = m; j >= 1; j--) f[i][j] = max(a[i][j] + f[i-1][j+1], max(f[i-1][j], f[i][j+1]));
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 四子王旗| 郑州市| 海阳市| 潢川县| 临澧县| 五原县| 江陵县| 仁寿县| 琼海市| 南昌市| 探索| 嘉鱼县| 牙克石市| 兴宁市| 庆阳市| 曲麻莱县| 莱阳市| 徐闻县| 丹凤县| 辽宁省| 工布江达县| 垦利县| 济南市| 信阳市| 承德市| 长垣县| 宜川县| 贵阳市| 新河县| 三亚市| 甘德县| 延庆县| 古丈县| 大同县| 巴南区| 方正县| 江陵县| 洞头县| 耿马| 铅山县| 藁城市|