線性dp

元始天尊123發表於2024-11-07

線性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;
}

相關文章