Hướng dẫn bài #584. DPFLOWER - Khăn đỏ và bó hoa tặng bà e với ạ

newmem 2021-06-01 15:07:43 2021-06-01 15:08:15

E làm bài này bị time limit ạ

#include <bits/stdc++.h>

using namespace std;

int m, n, tong = 0, tong1 = 0;
int f[1005][1005];
vector<int> ip;
vector<int> jp;
vector<int> sht;

int main()
{
    cin >> m >> n;
    for(int i = 1; i <= m; i++){
        for(int j = 1; j <= n; j++){
            cin >> f[i][j];
        }
    }
    int i = 1, j = 1, a, b;
    for(int g = 0; g <= ip.size(); g++){
        while(i != m || j != n){
            if(i < m){
                a = f[i+1][j];
            } else {
                a = -1;
            }
            if(j < n){
                b = f[i][j+1];
            } else {
                b = -1;
            }
            if(a != -1 && b != -1){
                if(min(a,b) == a){
                    ip.push_back(i+1);
                    jp.push_back(j);
                } else {
                    ip.push_back(i);
                    jp.push_back(j+1);
                }
                sht.push_back(tong);
            }
            if(max(a, b) != -1){
                if(max(a,b) == a){
                    i++;
                } else {
                    j++;
                }
            } else {
                i = m; j = m;
            }
            tong += f[i][j];
        }
        if(tong > tong1)
            tong1 = tong;
        if(g <= ip.size()){
            tong = sht[g];
            i = ip[g];
            j = jp[g];
        }
    }
    cout << tong1;
    return 0;
}

Tổng cộng 1 trả lời

Nguyễn Hoàng Sơn

Code này của bạn trông giống như là đang xét tất cả các đường đi vậy

Bài yêu cầu quy hoạch động O(n^2). Cụ thể bạn cần lưu giá trị min cho mỗi ô (giá trị ban đầu mỗi ô là 1000000009) gọi là mảng sum[1005][1005]. Mỗi lần đi đến một ô, vd đang ở ô i, j xét ô i+1, j cần thỏa mãn điều kiện (sum[i+1][j] > sum[i][j] + f[i + 1][j]). Thỏa mãn điều kiện thì thêm ô đấy vào một mảng để tiếp tục xét không thì continue vòng lặp

Kết quả là sum[n][m]