C++动态规划
数塔:
#include <iostream> using namespace std; int a[1000][1000]; int main(){ int n; cin>>n; for(int i=0;i<n;i++){ for(int j=0;j<i+1;j++){ cin>>a[i][j]; } } for(int i=n-2;i>=0;i--){ for(int j=0;j<i+1;j++){ a[i][j]+=a[i+1][j]>a[i+1][j+1]?a[i+1][j]: a[i+1][j+1]; } } cout<<a[0][0]; }
最大连续子序列
#include <iostream> #include <algorithm> using namespace std; int a[1000]; int main(){ int n;int mx=0; while(1){ mx=0; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=n;i++){ a[i]+=a[i-1]>0?a[i-1]:0; if(a[i]>mx) mx=a[i]; } cout<<mx; } }
馅饼(仿数塔):
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int a[13][1000];int x,y; int main(){ int n;int mx=0; while(1){ cin>>n; for(int i=0;i<n;i++){ cin>>x>>y; a[x+1][y]+=1; if(y>mx) mx=y; } for(int i=mx-1;i>=0;i--){ for(int j=1;j<12;j++){ a[j][i]+=max(a[j-1][i+1],max(a[j][i+1],a[j+1][i+1])); } } cout<<a[6][0]; } }