Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion site/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
<meta name="twitter:title" content="DP大师 · DP Master" />
<meta name="twitter:description" content="DP大师面向算法学习者,用精讲、逐帧可视化、题目索引和小游戏讲清状态定义、转移顺序与模型迁移。" />
<meta name="twitter:image" content="https://dp.round1.cc/og/dpmaster-social.jpg" />
<script id="dp-structured-data" type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://dp.round1.cc/#publisher","name":"AzureL蔚澜算法","url":"https://dp.round1.cc","logo":"https://dp.round1.cc/favicon.svg","brand":{"@type":"Brand","name":"DP大师"}},{"@type":"WebSite","@id":"https://dp.round1.cc/#website","name":"DP大师","alternateName":"DP Master","url":"https://dp.round1.cc/","description":"DP大师用精讲、逐帧可视化、题目索引和小游戏讲清动态规划。","inLanguage":"zh-Hans","publisher":{"@id":"https://dp.round1.cc/#publisher"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://dp.round1.cc/problems?q={search_term_string}"},"query-input":"required name=search_term_string"}},{"@type":"WebPage","@id":"https://dp.round1.cc/#webpage","url":"https://dp.round1.cc/","name":"DP大师 · DP Master","description":"DP大师面向算法学习者,用精讲、逐帧可视化、题目索引和小游戏讲清状态定义、转移顺序与模型迁移。","abstract":"DP大师面向算法学习者,用精讲、逐帧可视化、题目索引和小游戏讲清状态定义、转移顺序与模型迁移。","inLanguage":"zh-Hans","isPartOf":{"@id":"https://dp.round1.cc/#website"},"publisher":{"@id":"https://dp.round1.cc/#publisher"},"isAccessibleForFree":true,"dateModified":"2026-08-23T21:18:04+08:00","image":"https://dp.round1.cc/og/dpmaster-social.jpg"}]}</script>
<script id="dp-structured-data" type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://dp.round1.cc/#publisher","name":"AzureL蔚澜算法","url":"https://dp.round1.cc","logo":"https://dp.round1.cc/favicon.svg","brand":{"@type":"Brand","name":"DP大师"}},{"@type":"WebSite","@id":"https://dp.round1.cc/#website","name":"DP大师","alternateName":"DP Master","url":"https://dp.round1.cc/","description":"DP大师用精讲、逐帧可视化、题目索引和小游戏讲清动态规划。","inLanguage":"zh-Hans","publisher":{"@id":"https://dp.round1.cc/#publisher"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://dp.round1.cc/problems?q={search_term_string}"},"query-input":"required name=search_term_string"}},{"@type":"WebPage","@id":"https://dp.round1.cc/#webpage","url":"https://dp.round1.cc/","name":"DP大师 · DP Master","description":"DP大师面向算法学习者,用精讲、逐帧可视化、题目索引和小游戏讲清状态定义、转移顺序与模型迁移。","abstract":"DP大师面向算法学习者,用精讲、逐帧可视化、题目索引和小游戏讲清状态定义、转移顺序与模型迁移。","inLanguage":"zh-Hans","isPartOf":{"@id":"https://dp.round1.cc/#website"},"publisher":{"@id":"https://dp.round1.cc/#publisher"},"isAccessibleForFree":true,"dateModified":"2026-08-27T05:20:51.219Z","image":"https://dp.round1.cc/og/dpmaster-social.jpg"}]}</script>
<!-- dp-route-head:end -->
</head>
<body>
Expand Down
94 changes: 47 additions & 47 deletions site/public/llms.txt

Large diffs are not rendered by default.

94 changes: 47 additions & 47 deletions site/public/route-summaries.json

Large diffs are not rendered by default.

94 changes: 47 additions & 47 deletions site/public/sitemap.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,190 +2,190 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://dp.round1.cc/</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:20:51.219Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/method</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:20:51.219Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/a</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:20:51.219Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/a/01</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.030Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/a/complete</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.030Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/a/cost2d</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.030Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/a/dep</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.031Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/a/fractional</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.031Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/a/group</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.032Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/a/mixed</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.032Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/a/multiple</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.033Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/a/variant</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.034Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/b</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:20:51.219Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/b/count</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.036Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/b/edit</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.020Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/b/fsm</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.019Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/b/lcs</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.021Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/b/lis</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.037Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/b/maxseg</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.035Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/b/path</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.022Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/c</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:20:51.219Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/c/merge</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.028Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/c/palindrome</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.025Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/c/ring</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.026Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/c/stone</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.027Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/c/tree</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.026Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/d</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:20:51.219Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/d/grid</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.023Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/d/matpow</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.038Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/e</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:20:51.219Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/e/basic</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.039Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/e/center</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:20:51.219Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/e/distsum</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.039Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/e/inout</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:20:51.219Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/f</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:20:51.219Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/f/count</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.042Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/f/cover</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.040Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/f/diameter</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.041Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/f/knapsack</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.042Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/f/select</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.041Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/g</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:20:51.219Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/g/board</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.016Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/g/cover</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.016Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/g/plug</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:20:51.219Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/g/subset</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.017Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/part/g/tsp</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:21:25.017Z</lastmod>
</url>
<url>
<loc>https://dp.round1.cc/problems</loc>
<lastmod>2026-08-23T21:18:04+08:00</lastmod>
<lastmod>2026-08-27T05:20:51.219Z</lastmod>
</url>
</urlset>
10 changes: 5 additions & 5 deletions site/src/components/demos/bitmask/BoardDemo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -55,23 +55,23 @@ export default function BoardDemo() {
<div>
<div className="stepper__lab">棋盘边长 N</div>
<div className="stepper__row">
<button onClick={() => changeN(N - 1)} disabled={N <= 3} aria-label="N 减">
<button type="button" onClick={() => changeN(N - 1)} disabled={N <= 3} aria-label="N 减">
<Minus size={13} />
</button>
<span className="stepper__val">{N}</span>
<button onClick={() => changeN(N + 1)} disabled={N >= 6} aria-label="N 加">
<button type="button" onClick={() => changeN(N + 1)} disabled={N >= 6} aria-label="N 加">
<Plus size={13} />
</button>
</div>
</div>
<div>
<div className="stepper__lab">放置王数 K</div>
<div className="stepper__row">
<button onClick={() => changeK(K - 1)} disabled={K <= 1} aria-label="K 减">
<button type="button" onClick={() => changeK(K - 1)} disabled={K <= 1} aria-label="K 减">
<Minus size={13} />
</button>
<span className="stepper__val">{K}</span>
<button onClick={() => changeK(K + 1)} disabled={K >= N * N} aria-label="K 加">
<button type="button" onClick={() => changeK(K + 1)} disabled={K >= N * N} aria-label="K 加">
<Plus size={13} />
</button>
</div>
Expand Down Expand Up @@ -148,7 +148,7 @@ export default function BoardDemo() {
/>

<div className="bm__count-row">
<button className="bm__count-btn" onClick={() => setShowCount((s) => !s)}>
<button type="button" className="bm__count-btn" onClick={() => setShowCount((s) => !s)}>
<Sigma size={15} /> {showCount ? '收起方案总数' : '看方案总数(状压 DP)'}
</button>
{showCount && total != null && (
Expand Down
8 changes: 4 additions & 4 deletions site/src/components/demos/bitmask/CoverDemo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ export default function CoverDemo() {
{Array.from({ length: N }, (_, el) => {
const on = ((c.cover >> el) & 1) === 1
return (
<button
<button type="button"
key={el}
className={`bm__cover-cell${on ? ' on' : ''}`}
onClick={() => toggleCover(ci, el)}
Expand All @@ -94,18 +94,18 @@ export default function CoverDemo() {
</div>
<div className="bm__choice-cost">
<span>代价</span>
<button onClick={() => bumpCost(ci, -1)} disabled={c.cost <= 1} aria-label="代价减">
<button type="button" onClick={() => bumpCost(ci, -1)} disabled={c.cost <= 1} aria-label="代价减">
<Minus size={11} />
</button>
<b>{c.cost}</b>
<button onClick={() => bumpCost(ci, 1)} disabled={c.cost >= 15} aria-label="代价加">
<button type="button" onClick={() => bumpCost(ci, 1)} disabled={c.cost >= 15} aria-label="代价加">
<Plus size={11} />
</button>
</div>
</div>
))}
</div>
<button className="bm__reset" onClick={reset} aria-label="重置">
<button type="button" className="bm__reset" onClick={reset} aria-label="重置">
<RotateCcw size={13} /> 复位
</button>
</div>
Expand Down
2 changes: 1 addition & 1 deletion site/src/components/demos/bitmask/SubsetEnumDemo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ export default function SubsetEnumDemo() {
{Array.from({ length: N }, (_, i) => {
const on = ((S >> i) & 1) === 1
return (
<button
<button type="button"
key={i}
className={`bm__toggle${on ? ' on' : ''}`}
onClick={() => toggle(i)}
Expand Down
14 changes: 7 additions & 7 deletions site/src/components/demos/bitmask/TspDemo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -89,28 +89,28 @@ export default function TspDemo() {
<div className="bm__mover" key={i}>
<span className="bm__mover-id">{i}</span>
<div className="bm__pad">
<button onClick={() => move(i, 0, 1)} aria-label={`点${i}上移`}>↑</button>
<button type="button" onClick={() => move(i, 0, 1)} aria-label={`点${i}上移`}>↑</button>
<div className="bm__pad-mid">
<button onClick={() => move(i, -1, 0)} aria-label={`点${i}左移`}>←</button>
<button type="button" onClick={() => move(i, -1, 0)} aria-label={`点${i}左移`}>←</button>
<span className="bm__coord">
{p.x},{p.y}
</span>
<button onClick={() => move(i, 1, 0)} aria-label={`点${i}右移`}>→</button>
<button type="button" onClick={() => move(i, 1, 0)} aria-label={`点${i}右移`}>→</button>
</div>
<button onClick={() => move(i, 0, -1)} aria-label={`点${i}下移`}>↓</button>
<button type="button" onClick={() => move(i, 0, -1)} aria-label={`点${i}下移`}>↓</button>
</div>
</div>
))}
</div>
<div className="bm__count">
<span className="demo-control__group-label" style={{ margin: 0 }}>点数 {n}</span>
<button onClick={removePt} disabled={n <= 3} aria-label="减少点">
<button type="button" onClick={removePt} disabled={n <= 3} aria-label="减少点">
<Minus size={13} />
</button>
<button onClick={addPt} disabled={n >= 5} aria-label="增加点">
<button type="button" onClick={addPt} disabled={n >= 5} aria-label="增加点">
<Plus size={13} />
</button>
<button className="bm__reset" onClick={() => setPts(INIT)} aria-label="重置点位">
<button type="button" className="bm__reset" onClick={() => setPts(INIT)} aria-label="重置点位">
<RotateCcw size={13} /> 复位
</button>
</div>
Expand Down
Loading