Tôi đang cố gắng giải quyết vấn đề từ SPOJ (link), có thể được mô tả ngắn gọn như sau: Cho khoảng thời gian n, mỗi khoảng có số nguyên bắt đầu và kết thúc, và kết thúc bằng thời gian tối đa (hãy gọi nó là max_end), tìm xem bạn có thể chọn bao nhiêu khoảng thời gian bao gồm 1 ... max_end. Khoảng thời gian có thể chồng lên nhau. Tôi đã thử một DP; lần đầu tiên sắp xếp theo thời gian kết thúc, sau đó dp [i] là một cặp, trong đó dp [i] .đầu tiên là số khoảng thời gian tối thiểu cần thiết để bao gồm 1 ... kết thúc [i] lần sử dụng cuối cùng i và dp [i] .second là số cách để làm điều đó. Đây là vòng DP chính của tôi:Trợ giúp trong vấn đề DP
for(int i = 1; i < n; i ++) {
for(int j = 0; j < i; j ++) {
if(! (x[ j ].end >= x[ i ].start - 1))
continue;
if(dp[ j ].first + 1 < dp[ i ].first) {
dp[ i ].first = dp[ j ].first + 1;
dp[ i ].second = dp[ j ].second;
}
else if(dp[ j ].first + 1 == dp[ i ].first) {
dp[ i ].second += dp[ j ].second;
}
}
}
Thật không may, nó không hoạt động. Ai đó có thể cho tôi biết tôi có sai sót không? Cảm ơn trước! :)
Giá trị ban đầu của bạn cho dp [0] là bao nhiêu? Ngoài ra, câu hỏi được liên kết đặc biệt yêu cầu số lượng khoảng thời gian ** tối thiểu ** bao gồm một ngày cụ thể; bạn có chắc chắn rằng thuật toán này đảm bảo rằng? – templatetypedef
Xin chào, tôi khởi tạo dp [0] .first = dp [0] .second = 1 nếu bắt đầu [0] = 1. Và tôi nghĩ thuật toán của tôi đảm bảo điều đó. Nếu bạn có bất kỳ giải pháp trong tâm trí của bạn tôi sẽ đánh giá cao nó :) – Chris
Bạn có thể xây dựng trên trực giác của bạn ở đây? Tôi không thể theo dõi lý do mã của bạn hoạt động. – templatetypedef