สมมติว่ามีเครื่องพิมพ์แปลก ๆ มันมีข้อกำหนดบางอย่าง -
- เครื่องพิมพ์สามารถพิมพ์ได้เฉพาะลำดับของอักขระเดียวกันในแต่ละครั้ง
- ในแต่ละรอบ เครื่องพิมพ์สามารถพิมพ์อักขระใหม่ที่เริ่มต้นและสิ้นสุดที่ใดก็ได้ และจะครอบคลุมอักขระเดิมที่มีอยู่
ดังนั้นถ้าเรามีสตริงที่ประกอบด้วยอักษรตัวล่าง งานของเราคือนับจำนวนรอบขั้นต่ำที่เครื่องพิมพ์ที่จำเป็นสำหรับการพิมพ์
ดังนั้นหากอินพุตเป็น "aaabba" จะใช้เวลา 2 รอบ พิมพ์ aaaaa ก่อนแล้วจึง b's โดยแทนที่อักขระ
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- n :=ขนาดของ s
- ถ้า n เหมือนกับ 0 ให้คืนค่า 0
- กำหนดอาร์เรย์ 2 มิติ dp หนึ่งรายการของคำสั่ง n x n เติมค่านี้ด้วยค่าอนันต์
- สำหรับการเริ่มต้น l :=1 เมื่อ l <=n อัปเดต (เพิ่ม l ขึ้น 1) ทำ −
- สำหรับการเริ่มต้น i :=0, j :=l - 1, เมื่อ j
- ถ้า l เหมือนกับ 1 แล้ว:dp[i, j] :=1
- สำหรับการเริ่มต้น i :=0, j :=l - 1, เมื่อ j
- มิฉะนั้น เมื่อ l เท่ากับ 2 แล้ว −
- dp[i, j] :=1 เมื่อ s[i] เหมือนกับ s[j] มิฉะนั้น 2
- มิฉะนั้น
- สำหรับการเริ่มต้น k :=i เมื่อ k
- อุณหภูมิ :=dp[i, k] + dp[k + 1, j]
- dp[i, j] :=ขั้นต่ำของ dp[i, j] และ (temp – 1 เมื่อ s[k] เหมือนกับ s[j] มิฉะนั้น temp
- สำหรับการเริ่มต้น k :=i เมื่อ k
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; const int INF = 1e9; class Solution { public: int strangePrinter(string s) { int n = s.size(); if(n == 0) return 0; vector < vector <int> > dp(n, vector <int>(n, INF)); for(int l = 1; l <= n; l++){ for(int i = 0, j = l - 1; j < n; i++, j++){ if(l == 1){ dp[i][j] = 1; }else if(l == 2){ dp[i][j] = s[i] == s[j] ? 1 : 2; }else{ for(int k = i; k < j; k++){ int temp = dp[i][k] + dp[k + 1][j]; dp[i][j] = min(dp[i][j], s[k] == s[j] ? temp - 1: temp); } } } } return dp[0][n - 1]; } }; main(){ Solution ob; cout << (ob.strangePrinter("aaabba")); }
อินพุต
“2*”
ผลลัพธ์
2