關於動態規劃,除了ppt裡講到的把子問題的結果儲存起來甭管後面是否用到這個顯著特點外,根據我目前粗淺的認識,覺得其解題步驟可以細化為以下幾步:
1. 根據題設找到或求出初始條件
具體如hdoj_1466求直線交點數這題,設bool p[21][191](最多輸入20條直線,對應最多190個交點),當p[i][j]==true時表示i條直線可以有j個交點。(最多輸入20條直線,對應最多190個交點)那麼p[i][0]==true;是肯定成立的,即全部直線都平行時交點為0。當然p[i][i-1]==true和p[i][2*i-4]==true等也是成立的,不過它們不是向後推倒的必要初始條件,即有p[i][j]==true就足夠了。
2. 【核心】找出遞推關係,推得全部子問題的答案
遞推方向一般是由簡向繁、自底向上。再比如上述的直線交點題:
m條直線的交點方案數
= (m-r)條平行線與r條直線交叉的交點數 + r條直線本身的交點方案
= (m-r)*r + r條之間本身的交點方案數
即p[j][k]→p[i][(i-j)*j+k],或者便於理解的形式:p[m+△x][n]→p[m+△x][m*△x+n],其中△x是增加的平行直線數,它們會和原來的m條直線交出m*△x個新交點,再加上原本的n個交點即可。雖然是二維陣列,但存在三個變數,故處理時是三重for迴圈。
3. 輸出給定起始條件時的答案
這個就沒啥說的了,注意輸出格式別錯就行。
hdoj_1466的具體**如下:
//hdoj_1466:輸入n(n<=20) 求n條直線的可能相交點數 已知無三條直線交於一點的可能
//利用bool型別的二維陣列 其中x表示直線數 y表示交點數 若為true則表示x條直線可以有y個交點
#include using namespace std;
bool p[21][191];
void init()
/* 課件中:m條直線的交點方案數
= (m-r)條平行線與r條直線交叉的交點數 + r條直線本身的交點方案
= (m-r)*r + r條之間本身的交點方案數
對應p[i][(i-j)*j+k]=true; 即i=m j=r k=r條直線交點數
*/int main()
return 0;
}
hdu 1466 計算直線的交點數
include intmain return0 一 n條直線把空間分成幾部分 現在說地是空間了,不是平面了,要注意!我們來討論一下吧 點分線 0維分1維 c n,1 c n,0 線分面 1維分2維 c n,2 c n,1 c n,0 麵分空間 2維分3維 c n,3 c n,2 c n,1 c n,...
hdu 1466 計算直線的交點數
平面上有n條直線,且無三線共點,問這些直線能有多少種不同交點數。比如,如果n 2,則可能的交點數量為0 平行 或者1 不平行 input 輸入資料報含多個測試例項,每個測試例項佔一行,每行包含乙個正整數n n 20 n表示直線的數量.output 每個測試例項對應一行輸出,從小到大列出所有相交方案,...
HDU1466 計算直線的交點數
1 n條直線互不平行且無三線共點的最多交點數max 1 2 n 1 n n 1 2 2 一般統計的方法 假設一共有n a b條直線 即n條直線分成2組,分別為a條和b條 則 總的交點數 a內的交點數 b內的交點數 a,b之間的交點數 3 我們來分析加入第n條直線的情況 這裡以n 4為例 分類方法 和...