【NOI题库 动态规划】
2016-06-01 17:16
253 查看
这个是部分NOI题库的动态规划先贴代码,解析挖个坑以后慢慢填。
1759:最长上升子序列
1775:采药
1808:公共子序列
1944:吃糖果
1996:登山
2718:移动路线
摘花生
1759:最长上升子序列
#include <iostream> #include <cstdio> #include <queue> #include <cstring> #include <string> using namespace std; int n,ans; struct node { int hi; //高度 int nu; //个数 }p[1005]; void init() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&p[i].hi); p[i].nu=1; } for(int i=n-1;i>=1;i--) for(int j=i+1;j<=n;j++) { if(p[i].hi<p[j].hi) p[i].nu=max(p[i].nu,p[j].nu+1); } for(int i=1;i<=n;i++) ans=max(ans,p[i].nu); cout<<ans; } int main() { init(); return 0; }
1775:采药
#include <iostream> #include <cstdio> #include <queue> #include <cstring> #include <string> using namespace std; int a[10000],c[10000],b[50000],v,n; int main() { cin>>v>>n; for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&c[i]); for(int i=1;i<=n;i++) for(int j=v;j>=a[i];j--) b[j]=max(b[j],b[j-a[i]]+c[i]); cout<<b[v]; }
1808:公共子序列
#include <iostream> #include <cmath> #include <cstdio> #include <queue> #include <algorithm> #include <cstring> #include <string> #define maxn 2000 using namespace std; int da[maxn][maxn],ans; bool pp; string s1,s2,s; void dp(string s1,string s2) { memset(da,0,sizeof(da)); s1="2"+s1;s2="3"+s2; for(int i=1;i<s1.length();i++) { for(int j=1;j<s2.length();j++) { if(s1[i]==s2[j]) da[i][j]=da[i-1][j-1]+1; else da[i][j]=max(da[i-1][j],da[i][j-1]); } } ans=da[s1.length()-1][s2.length()-1]; } void init() { while(cin>>s1&&cin>>s2) { dp(s1,s2); cout<<ans<<endl; } } int main() { init(); }
1944:吃糖果
#include <iostream> #include <cstdio> #include <queue> #include <algorithm> #include <cstring> #include <string> #include <map> using namespace std; int a[100],n; void cl(int q) { for(int i=3;i<=q;i++) a[i]=a[i-1]+a[i-2]; } void init() { cin>>n; } int main() { init(); a[1]=1;a[2]=2; cl(n); cout<<a ; return 0; }
1996:登山
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> #include <map> #include <string> using namespace std; int n,ans; struct node { int hi; int up; //下降 int dd; //上升 }p[1000]; void sr() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&p[i].hi),p[i].dd=1,p[i].up=1; for(int i=n-1;i>=1;i--) for(int j=i+1;j<=n;j++) { if(p[i].hi>p[j].hi) p[i].up=max(p[i].up,p[j].up+1); } for(int i=2;i<=n;i++) for(int j=i-1;j>=1;j--) { if(p[i].hi>p[j].hi) p[i].dd=max(p[i].dd,p[j].dd+1); } for(int i=1;i<=n;i++) { ans=max(ans,p[i].up+p[i].dd-1); } cout<<ans; } int main() { sr(); return 0; }
2718:移动路线
#include <iostream> #include <cstdio> #include <queue> #include <algorithm> #include <cstring> #include <string> #include <map> #define maxn 105 using namespace std; int ma[maxn][maxn],n,m; void read_column_number() { cin>>m>>n; ma[1][1]=1; for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { ma[i][j]=ma[i][j]+ma[i-1][j]+ma[i][j-1]; //cout<<ma[i][j]<<" "; } //cout<<endl; } cout<<ma[m] ; } int main() { read_column_number(); return 0; }
摘花生
#include <iostream> #include <cstdio> #include <queue> #include <algorithm> #include <cstring> #include <string> #include <map> #define maxn 105 using namespace std; int ma[maxn][maxn],n,r,c; void dp() { for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) { ma[i][j]=max(ma[i-1][j]+ma[i][j],ma[i][j-1]+ma[i][j]); } cout<<ma[r][c]<<endl; } void read_column_number() { cin>>n; for(int i=1;i<=n;i++) { r=0;c=0; scanf("%d%d",&r,&c); for(int y=1;y<=r;y++) for(int x=1;x<=c;x++) { ma[y][x]=0; scanf("%d",&ma[y][x]); } dp(); } } int main() { read_column_number(); }
相关文章推荐
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- C#使用动态规划解决0-1背包问题实例分析
- 动态规划
- C++ 动态规划
- 动态规划解决背包问题的核心思路
- DP(动态规划) 解游轮费用问题
- 动态规划的用法——01背包问题
- 动态规划的用法——01背包问题
- 《收集苹果》 动态规划入门
- 《DNA比对》蓝桥杯复赛试题
- 《背包问题》 动态规划
- 自顶向下动态规划解决最长公共子序列(LCS)问题
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 关于爬楼梯的动态规划算法
- 动态规划 --- hdu 1003 **
- DP问题各种模型的状态转移方程
- 0-1背包解题过程
- 背包问题
- USACO 3.2.2:Stringsobits