问题 E: Connecting Territories(DP)
题目描述
Ava is playing a strategic game on a grid of tiles.Each tile has an associated cost. When the costs of the tiles are read from left to right, starting with the first row, a repeating pattern of the first M positive integers in increasing order is revealed:
1, 2, 3, . . . , M, 1, 2, 3, . . . , M, 1, 2, 3, . . .. In this pattern,M represents the maximum cost of a tile. In the grid of tiles shown, M is equal to 5.
Ava needs to purchase one tile in each row in order to make a connecting path from the upper territory (above the first row of tiles) to the lower territory (below the last row of tiles). The first tile purchased must be in the first row. Each subsequently purchased tile must share either an edge or a corner with the tile purchased previously. In the grid of tiles shown, the cost of Ava’s connecting path is 9.
Given a grid of tiles, your job is to determine the minimum cost of a connecting path between the upper and lower territories.
输入
The first line of input contains a positive integer, R, representing the number of rows in the grid. The second line contains a positive integer, C, representing the number of columns in the grid. The third line contains a positive integer, M where M ≤ 100 000, representing the maximum cost of a tile.
The following table shows how the available 15 marks are distributed:
输出
Output the positive integer, P, which is the minimum cost of a connecting path between the upper and lower territories.
样例输入 Copy
3 5 7样例输出 Copy
6提示
Explanation of Output for Sample Input
The cost of each tile is shown. The sequence of tiles that Ava should purchase to minimize the cost of a connecting path is highlighted in green.
动态规划 开数组只保存上一行的数据
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int r,c,m;
int main(){cin>>r>>c>>m;vector<int>pre(c);for(int j=0;j<c;++j)pre[j]=j%m+1;for(int i=1;i<r;++i){vector<int>jam(c,INT_MAX);//LLONG_MAXfor(int j=0;j<c;++j){int x=(i*c+j)%m+1;for(int k=max(0,j-1);k<=min(c-1,j+1);++k)jam[j]=jam[j]>x+pre[k]?x+pre[k]:jam[j]; }pre=move(jam);}int ans=INT_MAX;for(int j=0;j<c;++j)ans=ans>pre[j]?pre[j]:ans;cout<<ans;return 0;
}