題目描述:給定乙個正n邊形,可以通過連線將這個多邊形分割成n-2個三角形,問這n-2個三角形中恰有k個等腰三角形的分割方法有多少?這個值可能很大,輸出對9397取模的結果。
資料範圍:n,k <= 50.
這道題也是區間dp,不過稍微難一點。
首先我們先想個辦法判斷等腰三角形,因為這是乙個正多邊形,所以我們對於三個點,我們可以計算一下他們的差的絕對值,直接比較這個是否相同即可。
之後就是怎麼dp了,想到剛才的三角劃分,這題應該也是一道區間dp。令dp[i][j][k]表示在區間i~j之內劃分出k個等腰三角形的方案數,之後我們列舉一下端點,判斷一下新的斷點能否形成等腰三角形進行轉移。
這樣的複雜度是o(n3*k2)的,會超時,我們考慮優化。因為這是乙個正多邊形,所以我們可以直接用dp[i][j]表示把以i個連續點為頂點的正多邊形劃分出j個等腰三角形的方案數。之後直接列舉從幾個連續點的位置斷開進行轉移即可,這樣複雜度被優化到了o(n2k2),可以過。
如果不大理解的話,可以結合凸多邊形三角劃分這道題想一想。
看一下**。
#include#include#include
#include
#include
#include
#include
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n')
using
namespace
std;
typedef
long
long
ll;const
int m = 10005
;const ll inf = 1000000009
;const
int mod = 9397
;int
read()
while(ch >= '
0' && ch <= '9'
)
return ans *op;
}int n,k,dp[105][105
];bool judge(int x,int
m)int dfs(int n,int
k)
return dp[n][k] =cur;
}int
main()
列印等腰三角形(1)
要列印的樣式 源 public class for7 內迴圈輸出 for int j 1 j 2 i 1 j system.out.println 解析 外迴圈不再多說,第乙個內迴圈是輸出前邊的空格,應該能看懂吧,好吧再說一下 當i 1 即第一行 時,j 1,j 5,說明 j 要迴圈四次,並輸出四個...
藍橋杯 等腰三角形
本題目要求你在控制台輸出乙個由數字組成的等腰三角形。具體的步驟是 先用1,2,3,的自然數拼乙個足夠長的串 用這個串填充三角形的三條邊。從上方頂點開始,逆時針填充。比如,當三角形高度是8時 輸入 輸入存在多組資料,對於每組資料 輸入一行包含乙個正整數n 3輸出 對於每組測試資料輸出用數字填充的等腰三...
等腰三角形的列印
列印出乙個等腰三角形。思路很容易 雙重for迴圈處理。難點在於如何控制等腰,讓圖形像個金字塔,可以想象乙個矩形挖成等腰三角形 package com.math.forth 列印出乙個等腰三角形。思路很容易 雙重for迴圈處理。難點在於如何控制等腰,讓圖形像個金字塔 author wql public...