Vấn đề 1: Trò chơi Combos [Neal Wu, 2012]
Bessie đang chơi một trò chơi video! Trong trò chơi, ba chữ 'A', 'B', và 'C' là các nút chỉ có giá trị. Bessie có thể bấm các nút theo thứ tự nào cô ấy thích; Tuy nhiên, chỉ có N combo riêng biệt có thể (1 <= N <= 20). Combo i được biểu diễn như là một chuỗi S_i có chiều dài từ 1 đến 15 và chỉ chứa các chữ cái 'A', 'B', và 'C'.
Bất cứ khi nào Bessie nhấn một sự kết hợp của các chữ cái phù hợp với một combo, cô nhận được một điểm cho combo. Combo có thể chồng chéo với nhau hoặc thậm chí hoàn thành cùng một lúc! Ví dụ nếu N = 3 và ba combo có thể là "ABA", "CB", và "ABACB", và Bessie ép "ABACB", cô sẽ kết thúc với 3 điểm. Bessie có thể ghi điểm cho một combo đơn nhiều hơn một lần.
Bessie tất nhiên muốn kiếm được điểm càng nhanh càng tốt. Nếu shepresses đúng K nút (1 <= K <= 1000), số điểm tối đa, cô có thể kiếm được là gì?
VẤN ĐỀ TÊN: combo
VÀO FORMAT:
* Line 1: Hai số nguyên cách ly: N và K.
* Dòng 2..N + 1: Dòng i + 1 chứa chỉ có chuỗi S_i, đại diện
kết hợp i.
MẪU INPUT (tập tin combos.in):
3 7
ABA
CB
ABACB
OUTPUT FORMAT:
* Dòng 1: Một số nguyên, số điểm tối đa Bessie có thể
có được.
MẪU OUTPUT (file combos.out):
4
OUTPUT CHI TIẾT:
Trình tự tối ưu của các nút trong trường hợp này là ABACBCB,
trong đó cung cấp 4 điểm - 1 từ ABA, 1 từ ABACB, và 2 từ CB.
Giải pháp
Giải pháp Ghi chú (Richard Peng): Một giải pháp đầu tiên rõ ràng sẽ là một trong những cố gắng tất cả 3K chuỗi dài K. Hãy xem xét những thay đổi nhỏ nhỏ sau đây của nó: thay vì đếm số lượng các điểm cuối cùng, khi chúng tôi liệt kê các ký tự tại i, chúng tôi đếm số điểm thu được bằng cách combo kết thúc ở vị trí i.
Sau đó, từ những đòn combo dài tối đa L ≤ 15, chúng ta chỉ cần theo dõi 15 ký tự cuối cùng trong chuỗi. Do đó, nhà nước của 15 giá trị trước đó trong chuỗi duy nhất xác định trạng thái của điều tra của chúng tôi, đưa ra một thuật toán thời gian O (3LLNK).
Tuy nhiên, lưu ý rằng chúng tôi có thể làm tốt hơn. Giả sử chúng ta đang ở vị trí i và có một số vị trí j < i như rằng chuỗi các ký tự giữa các vị trí j và tôi không phải là một chuỗi con của bất kỳ combo. Sau đó, không thể có bất kỳ kết hợp bắt đầu trước khi vị trí j mà kết thúc ở vị trí sau tôi.
Do đó, chúng ta chỉ cần theo dõi phần của chuỗi đó là một chuỗi con của một trong những đòn combo. Chính xác hơn, chúng tôi xác định j sớm nhất, hoặc hậu tố dài nhất của dãy cho đến nay đó là một chuỗi con của một số combo. Vì chỉ có chuỗi con O (NL2) có thể có của một trong những đòn combo, điều này ngay lập tức mang lại số lượng của các nước được một cái gì đó dễ quản lý. Vì mỗi nhà nước chỉ được sửa đổi bằng cách thêm vào một trong 3 nhân vật (A, B, C) với nó, quá trình chuyển đổi vị trí i + 1 cũng có thể được precomputed trong O (N2L4) thời gian ngây thơ. Trong tổng số này cho một O (N2L4 + NL2K) thuật toán, mà là đủ cho toàn bộ số điểm. Tuy nhiên lưu ý một chi tiết quan trọng là nhiều combo có thể kết thúc ở vị trí tôi, làm cho nó cần thiết để precompute một số điểm cho mỗi tiểu bang là tốt.
Một số cải tiến hơn nữa là có thể, với các mắt nhất mà thay vì xem xét các chuỗi con của combo, chúng tôi chỉ xem xét các tiền tố. Điều này là bởi vì nếu một combo kết thúc sau khi tôi, nó phải bắt đầu ở đâu đó trước đây. Một lần nữa, chăm sóc đặc biệt là cần thiết để đảm bảo rằng nhà nước theo dõi hậu tố dài nhất đó là một tiền tố của một số combo. Điều này cho phép một thuật toán thời gian O (N2L2 + NLK).
Dưới đây là một thực hiện một thuật toán hơi khác nhau từ vấn đề tác giả Neal Wu, trong đó ông chỉ xem xét các quốc gia nơi mà một trong những đòn combo là lần xuất hiện chính xác ở vị trí i, với một chút công việc thực hiện quá trình chuyển đổi máy tính.
#include làm cho nó cần thiết để precompute một số điểm cho mỗi tiểu bang là tốt. Một số cải tiến hơn nữa là có thể, với các mắt nhất mà thay vì xem xét các chuỗi con của combo, chúng tôi chỉ xem xét các tiền tố. Điều này là bởi vì nếu một combo kết thúc sau khi tôi, nó phải bắt đầu ở đâu đó trước đây. Một lần nữa, chăm sóc đặc biệt là cần thiết để đảm bảo rằng nhà nước theo dõi hậu tố dài nhất đó là một tiền tố của một số combo. Điều này cho phép một thuật toán thời gian O (N2L2 + NLK). Dưới đây là một thực hiện một thuật toán hơi khác nhau từ vấn đề tác giả Neal Wu, trong đó ông chỉ xem xét các quốc gia nơi mà một trong những đòn combo là lần xuất hiện chính xác ở vị trí i, với một chút công việc thực hiện quá trình chuyển đổi máy tính. #include làm cho nó cần thiết để precompute một số điểm cho mỗi tiểu bang là tốt. Một số cải tiến hơn nữa là có thể, với các mắt nhất mà thay vì xem xét các chuỗi con của combo, chúng tôi chỉ xem xét các tiền tố. Điều này là bởi vì nếu một combo kết thúc sau khi tôi, nó phải bắt đầu ở đâu đó trước đây. Một lần nữa, chăm sóc đặc biệt là cần thiết để đảm bảo rằng nhà nước theo dõi hậu tố dài nhất đó là một tiền tố của một số combo. Điều này cho phép một thuật toán thời gian O (N2L2 + NLK). Dưới đây là một thực hiện một thuật toán hơi khác nhau từ vấn đề tác giả Neal Wu, trong đó ông chỉ xem xét các quốc gia nơi mà một trong những đòn combo là lần xuất hiện chính xác ở vị trí i, với một chút công việc thực hiện quá trình chuyển đổi máy tính. #include với ngay lập tức nhất là thay vì xem xét các chuỗi con của combo, chúng tôi chỉ xem xét các tiền tố. Điều này là bởi vì nếu một combo kết thúc sau khi tôi, nó phải bắt đầu ở đâu đó trước đây. Một lần nữa, chăm sóc đặc biệt là cần thiết để đảm bảo rằng nhà nước theo dõi hậu tố dài nhất đó là một tiền tố của một số combo. Điều này cho phép một thuật toán thời gian O (N2L2 + NLK). Dưới đây là một thực hiện một thuật toán hơi khác nhau từ vấn đề tác giả Neal Wu, trong đó ông chỉ xem xét các quốc gia nơi mà một trong những đòn combo là lần xuất hiện chính xác ở vị trí i, với một chút công việc thực hiện quá trình chuyển đổi máy tính. #include với ngay lập tức nhất là thay vì xem xét các chuỗi con của combo, chúng tôi chỉ xem xét các tiền tố. Điều này là bởi vì nếu một combo kết thúc sau khi tôi, nó phải bắt đầu ở đâu đó trước đây. Một lần nữa, chăm sóc đặc biệt là cần thiết để đảm bảo rằng nhà nước theo dõi hậu tố dài nhất đó là một tiền tố của một số combo. Điều này cho phép một thuật toán thời gian O (N2L2 + NLK). Dưới đây là một thực hiện một thuật toán hơi khác nhau từ vấn đề tác giả Neal Wu, trong đó ông chỉ xem xét các quốc gia nơi mà một trong những đòn combo là lần xuất hiện chính xác ở vị trí i, với một chút công việc thực hiện quá trình chuyển đổi máy tính. #include chăm sóc đặc biệt là cần thiết để đảm bảo rằng nhà nước theo dõi hậu tố dài nhất đó là một tiền tố của một số combo. Điều này cho phép một thuật toán thời gian O (N2L2 + NLK). Dưới đây là một thực hiện một thuật toán hơi khác nhau từ vấn đề tác giả Neal Wu, trong đó ông chỉ xem xét các quốc gia nơi mà một trong những đòn combo là lần xuất hiện chính xác ở vị trí i, với một chút công việc thực hiện quá trình chuyển đổi máy tính. #include chăm sóc đặc biệt là cần thiết để đảm bảo rằng nhà nước theo dõi hậu tố dài nhất đó là một tiền tố của một số combo. Điều này cho phép một thuật toán thời gian O (N2L2 + NLK). Dưới đây là một thực hiện một thuật toán hơi khác nhau từ vấn đề tác giả Neal Wu, trong đó ông chỉ xem xét các quốc gia nơi mà một trong những đòn combo là lần xuất hiện chính xác ở vị trí i, với một chút công việc thực hiện quá trình chuyển đổi máy tính. #include
#include
#include
#include
using namespace std;
FILE * = input fopen ( "combos.in", "r"), * = Sản lượng fopen ( "combos.out", "w");
const int N_MAX = 105, LEN_MAX = 105, K_MAX = 1005;
int N, K, combo_len [N_MAX];
combo char [N_MAX] [LEN_MAX];
int chứa [N_MAX] [LEN_MAX], đính kèm [N_MAX] [N_MAX];
int dp [K_MAX] [N_MAX];
trận bool (int a, int b, int offset)
{
int a_len = combo_len [a], b_len = combo_len [b];
khẳng định (bù đắp <= b_len && b_len - bù đắp <= a_len);
int a_start = a_len - (b_len - offset);
trở strncmp (combo [a] + a_start, combo [b], b_len - offset) == 0;
}
Int main ()
{
fscanf (đầu vào, "% d% d", & N, K &);
for (int i = 0; i <N;
i ++) {
fscanf (đầu vào, "% s", combo [i]);
combo_len [i] = strlen (combo [i]);
}
Memset (chứa, 0, sizeof (chứa));
for (int i = 0; i <N; i ++)
{
chứa [i] [0] = 0;
for (int cuối = combo_len [i], offset = 0; cuối> = 0; end--, bù đắp ++)
{
int xảy ra = 0;
for (int j = 0; j <N; j ++)
if (cuối> = combo_len [j] && strncmp (combo [i] + end - combo_len [j], combo [j], combo_len [j]) == 0 )
xảy ra ++;
conta i ++) { chứa [i] [0] = 0; for (int cuối = combo_len [i], offset = 0; cuối> = 0; end--, bù đắp ++) { int xảy ra = 0; for (int j = 0; j <N; j ++) if (cuối> = combo_len [j] && strncmp (combo [i] + end - combo_len [j], combo [j], combo_len [j]) == 0 ) xảy ra ++; conta i ++) { chứa [i] [0] = 0; for (int cuối = combo_len [i], offset = 0; cuối> = 0; end--, bù đắp ++) { int xảy ra = 0; for (int j = 0; j <N; j ++) if (cuối> = combo_len [j] && strncmp (combo [i] + end - combo_len [j], combo [j], combo_len [j]) == 0 ) xảy ra ++; conta
đang được dịch, vui lòng đợi..
