线性dp
线性dp
线性dp是一种很常见的dp分析方式,关系之间具有线性的关系,状态之间相互递推,之后求出最终状态,今天完成了两道dp的题目
第一个问题看似是四维打表实际上使用线性的方式分析可以很快的求出结果没必要维护三维的空间
第二个问题要记录数列的个数,我们首先要知道几个递推关系,如果几个数之间公差确定,以最后一个结尾的个数是倒数第二个数的个数加1,同时
同时一个数也算等差数列所以可以线性的求出结果
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<map>
#include<unordered_map>
#include<stack>
#include<vector>
typedef long long LL;
using namespace std;
#define INF 0x3f3f3f3f
typedef pair<int,int>PII;
#define x first
#define y second
const int N=1e4+50;
int dp[N];
int t[N],x[N],y[N];
int main(){
int n,m;
cin>>n>>m;
int a,b,c;
for(int i=1;i<=m;i++){
cin>>t[i]>>x[i]>>y[i];
}
for(int i=1;i<=m;i++){
dp[i]=1;
for(int j=1;j<i;j++){
if((abs(x[i]-x[j])+abs(y[i]-y[j]))<=t[i]-t[j]){
dp[i]=max(dp[j]+1,dp[i]);
}
}
}
int ma=0;
for(int i=1;i<=m;i++){
ma=max(dp[i],ma);
}
cout<<ma;
return 0;
}
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<map>
#include<unordered_map>
#include<stack>
#include<vector>
typedef long long LL;
using namespace std;
#define INF 0x3f3f3f3f
#define MOD 998244353
typedef pair<int,int>PII;
#define x first
#define y second
const int N=1e3+50;
LL dp[N][20000*2+20];
LL A[N];
int main(){
int P=20000;
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>A[i];
}
LL res=0;
for(int i=1;i<=n;i++){
res++;
for(int j=i-1;j>0;j--){
dp[i][A[i]-A[j]+P]=(dp[i][A[i]-A[j]+P]+1+dp[j][A[i]-A[j]+P])%MOD;
res=(dp[j][A[i]-A[j]+P]+res+1)%MOD;
}
}
cout<<res;
return 0;
}