您的位置:首页 > 其它

区间动规经典(水题)大合集

2016-05-18 21:24 399 查看
数字三角形

#include<cmath>
#include<cstdio>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 100
using namespace std;
int n,dp[MAXN+10][MAXN+10],tri[MAXN+10][MAXN+10];
void init(){
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= i ;j++) scanf("%d",&tri[i][j]);
memset(dp,0,sizeof dp);
for (int i = 1; i <= n; i++) dp
[i] = tri
[i];
}
void DP(){
for (int i = n-1; i >= 1; i--)
for (int j = 1; j <= i; j++)
{
int max = tri[i][j] + dp[i+1][j];
if (dp[i+1][j+1] + tri[i][j] > max) max = dp[i+1][j+1] + tri[i][j];
dp[i][j] = max;
}
cout << dp[1][1] ;
}
int main(){
init();
DP();
return 0;
}


最长公共子序列

#include<cmath>
#include<cstdio>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 200
using namespace std;
int n,dp[MAXN+10][MAXN+10];
char X[MAXN+10],Y[MAXN+10];
void init(){
cin >> X;
cin >> Y;
memset(dp,0,sizeof dp);
}

int lcs(int m, int n){
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++)
{
if (X[i-1] == Y[j-1]) dp[i][j] = dp[i-1][j-1] + 1;
else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
return dp[m]
;
}
int main(){
init();
cout << lcs(strlen(X),strlen(Y));
return 0;
}


采药(背包)

#include<cmath>
#include<cstdio>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 1000
using namespace std;
int T,M;
int v[MAXN+10],w[MAXN+10],dp[MAXN+10][MAXN+10];
void init(){
cin >> T >> M ;
for (int i = 1; i <= M; i++) scanf("%d%d",&v[i],&w[i]);
}
int f(int T, int n){
for (int i = 0; i <= T; i++) dp[i][0] = 0;
for (int i = 1; i <= n; i++)
for (int j = 0; j<= T; j++)
{
dp[j][i] = dp[j][i-1];
if (j >= v[i] && dp[j-v[i]][i-1] + w[i] > dp[j][i])
dp[j][i] = dp[j-v[i]][i-1] + w[i];
}
return dp[T]
;
}
int main(){
init();
cout << f(T,M);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: