今天看了一下dp
来看看代码吧
//*****LIS
#include<bits/stdc++.h>
using namespace std;
int a[10010];
int dp[10010];
int main()
{
int n ;
while (cin>>n&&n)
{
for(int i=1;i<n;i++)
{
for(int j=1;j<i;j++)
{
if(a[i]>a[j])
{
dp[i]=max(dp[j]+1,dp[i]);
}
}
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
}
return 0;
}
//hdu1257 导弹拦截系统 lis
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f
int dp[10010]; //dp[i]表示长度为i+1的子序列末尾元素的最小值;
int a[10010];
int main()
{
int n;
while(cin>>n&&n)
{
for(int i=0;i<n;i++)
{
cin>>a[i];
dp[i]=INF;
}
for(int i=0;i<n;i++)
{
*lower_bound(dp,dp+n,a[i])=a[i];//找到>=a[i]的第一个元素
}
cout<<lower_bound(dp,dp+n,INF)-dp<<endl;//找到第一个INF的地址
}
return 0;
}
//*******LCS示例代码
#include <bits/stdc++.h>
using namespace std;
string s1,s2,s3;
int dp[1000][1000];
int len1,len2;
int main()
{
while(cin>>s1>>s2)
{
memset(dp,0,sizeof(dp));
len1=s1.length();
len2=s2.length();
for(int i=0;i<len1;i++)
{
for(int j=0;j<len2;j++)
{
if(s1[i]==s2[j])
dp[i+1][j+1]=dp[i][j]+1;
else
{
dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);
}
}
}
cout<<dp[len1][len2]<<endl;
}
return 0;
}
//*******01背包问题
状态转换方程
dp[i][j] MAX{dp[i-1],[j-wi]+Vi(j>=Wi),dp[i-1][j]}
#include<bits/stdc++.h>
using namespace std;
int n,m;
int dp[1000];
int v[1000];
int w[1000];
int main()
{
while(cin>>n>>m)
{
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
{
cin>>w[i]>>v[i];
}
for(int i=0;i<n;i++)
{
for(int j=m;j>=w[i];j--){
dp[j] = max(dp[j],dp[j-w[i]]=v[i]);
}
}
cout<<dp[m]<<endl;
}
return 0;
}
测试示例
5
1 2 3 4 5
w 3 2 6 4 3
v 4 2 3 7 1
dp[10] dp[7]+4,dp[10]
//完全背包
#include<bits/stdc++.h>
using namespace std;
int n,m;
int dp[1000];
int v[1000];
int m[1000];
int main()
{
while (cin>>n>>m)
{
}
}
就是今天就是只学了LIS和LCS以及背包
参考hdu1257拦截系统的题目