dp常見問題

2021-08-15 21:07:55 字數 3731 閱讀 6763

poj1163

數塔 dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+a[i][j];

#include 

#include

using

namespace

std;

int a[105][105];

int dp[105][105];

int main()

}int ans=-1;

for(int i=1;i<=n;i++)

可以只用一維陣列存本次最優解,節省了空間

#include 

#include

using

namespace

std;

int a[105][105];

int dp[105];

int main()

}for(int i=1;i<=n;i++)

dp[i]=a[n][i];

for(int i=n-1;i>=0;i--)

}cout

<1]0;}

最長連續子串行

hdu1231

dp[i]是以i結尾的最長連續子串行,

dp[i]=max(dp[i-1]+a[i],a[i]);

#include 

#include

#include

using

namespace

std;

const

int maxn=10005;

int a[maxn];

int dp[maxn];

int pos[maxn];//pos[i],以i結尾序列的起始點

int n;

int main()

if(ans<0)

for(int i=0;iif(dp[i]==ans)}}

return

0;}

hdu1003一樣,只是記錄下標

#include 

#include

#include

using namespace std;

const int maxn=100005;

int a[maxn];

int dp[maxn];

intpos[maxn];

int main()

for(int i=0;iif(ans==dp[i])

}if(cas!=t)

printf("\n");

}return

0;}

最長遞增子串行

原文:一.o(n*n)演算法,dp[i]表示以ai為末尾的最長上公升子串行的長度,而以ai結尾的最長上公升子串行有兩種:

1.只包含ai的子串行;  2.在滿足j

int ans=0;

for(int i=1;ifor(int j=0;jif(a[j]1,dp[i]);

} }

ans=max(ans,dp[i]);

} printf("%d\n",ans);

} return

0;

}

二.o(nlogn)演算法,dp[i]=長度為i+1的上公升子串行中末尾元素的最小值(不存在的話就是inf)

這種演算法中,運用stl中的lower_bound()函式很方便。

#include

#include

#include

using

namespace

std;

#define inf 0x3f3f3f

int dp[10010];//dp[i]表示長度為i+1的子串行末尾元素最小值;

int a[10010];

int main()

for(int i=0;i//找到》=a[i]的第乙個元素,並用a[i]替換;

} printf("%d\n",lower_bound(dp,dp+n,inf)-dp);//找到第乙個inf的位址減去首位址就是最大子串行的長度;

} return

0;

}

hdu1257 最長非遞增子串行

dp[i]=max(dp[i],dp[j]+1) ( 0<=j

#include 

#include

using

namespace

std;

const

int maxn=1010;

int a[maxn];

int dp[maxn];

int main()

for(int i=1;i<=n;i++)

}int ans=0;

for(int i=1;i<=n;i++)

ans=max(ans,dp[i]);

printf("%d\n",ans);

}return

0;}

4.最長公共子串行

dp[i,j] = 0 i=0 || j=0

dp[i,j] = dp[i-1][j-1]+1 i>0,j>0, a[i] = b[j]

dp[i,j] = max(dp[i-1][j],dp[i][j-1]) i>0,j>0, a[i] != b[j]

#include

#include

#include

using

namespace

std;

char a[1005],b[1005];

int dp[1005][1005];

int main()

cout

0;}

最長回文子串行

最長回文子串行 lps(longest palindromic subsequence),該問題為動態規劃的

經典題目。分析後可以得到該問題的實質如下:

對任意字串,如果頭和尾相同,那麼它的最長回文子串行一定是去頭去尾之後

的部分的最長回文子串行加上頭和尾。如果頭和尾不同,那麼它的最長回文子序

列是去頭的部分的最長回文子串行和去尾的部分的最長回文子串行的較長的那

乙個。

轉化為 dp 的狀態轉移方程如下:

設字串為s,dp[ i ][ j ]表示s[i….j]的lps;

狀態轉移方程:

當 i > j 時,dp[ i ][ j ]=0;

當 i = j 時,dp[ i ][ j ]=1;

當 i < j 且s[ i ] = s[ j ] 時,dp[ i ][ j ] = dp[ i-1 ][ j-1]+2;

當 i < j 且s[ i ] != s[ j ] 時,dp[ i ][ j ] = max( dp[ i+1][ j ] , dp[ i ][ j-1] );

時間複雜度o(n*n),只適合資料較小時,較大時馬拉車

#include 

#include

using

namespace

std;

int dp[400][400];

void lps(char s,int len)

}}int main()

常見問題 朗動常見問題

常見問題一 方向盤變沉 檢查胎壓是否正常,輪胎是否過度磨損。助力幫浦不工作,前輪氣壓低。冬天的話,冷車在冬天助力油比較稠,方向會重一點。檢查轉向助力油。1 應該是是助力系統有問題或則助力潤滑油有問題。2 如果你在駕車時感覺方向盤變緊,汽車偏向一側,需要檢查輪胎,或進行車輪平衡 定位。在這些問題剛剛發...

面試常見問題 1 this的常見問題

this 的含義 this關鍵字是乙個非常重要的語法點。毫不誇張地說,不理解它的含義,大部分開發任務都無法完成。前一章已經提到,this可以用在建構函式之中,表示例項物件。除此之外,this還可以用在別的場合。但不管是什麼場合,this都有乙個共同點 它總是返回乙個物件。簡單說,this就是屬性或方...

Spring常見問題

1 利用spring框架程式設計,console列印出log4j warn please initialize the log4j system properly?lupa開源社群 u i w.d t 說 明你的log4j.properties沒有配置。請把log4j.properties放到工程的...