區間DP 等腰三角形

2022-05-05 17:45:10 字數 1231 閱讀 5388

題目描述:給定乙個正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...