分析:
DP水题
反过来考虑终点在移动
设终点移动过的最左,右,上,下的点,构成一个矩形,显然在矩形内部移动是没有代价的。
所以只需要考虑如何拓展这个矩形:如果矩形左移一格,那么右侧一部分点就再也到不了了,如果矩形上移一格,那么下侧一部分点就再也到不了了,这些点的数量可以统计出来。
然后求出终点的移动区间为整个区间时,至少删了多少个点。
转移很简单,分当前矩形是否与边界相交即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define SF scanf
#define PF printf
#define MAXN 105
using namespace std;
typedef long long ll;
int n,m,sum,ex,ey;
char s[MAXN][MAXN];
short int dp[MAXN][MAXN][MAXN][MAXN];
int addx[MAXN][MAXN][MAXN],addy[MAXN][MAXN][MAXN];
ll add1(int new1,int d,int l,int r){
int l1=r-ey+1;
int r1=l+m-ey;
if(new1>d)
return addx[new1][l1][r1];
else
return addx[new1][l1][l-1]+addx[new1][r+1][r1];
}
ll add2(int new1,int u,int l,int r){
int l1=r-ey+1;
int r1=l+m-ey;