有新发现了不?
最长上升子序列
传送门
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char** argv) {
int n;
cin>>n;
int a[n];
int dp[n];
for(int i=0;i<n;i++){
cin>>a[i];
dp[i]=1;
}
for(int k=1;k<n;k++){
int m=1;
for(int i=0;i<k;i++){
if(a[i]<a[k]){
dp[k]=dp[i]+1;
if(dp[k]>m)m=dp[k];
}
}
dp[k]=m;
}
cout<<*max_element(dp,dp+n);
return 0;
}
help Jimmy
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
struct st{
int x1,x2,h;
}a[1001];
bool cmp(st s1,st s2){
return (s1.h<s2.h);
}
int dp[1001][2];
int n,x,y,mx;
void left(int i){
int k=i-1;
while(k>0&&a[i].h-a[k].h<=mx){
if(a[k].x1<=a[i].x1&&a[k].x2>=a[i].x1) {
dp[i][0]=a[i].h-a[k].h+min(dp[k][0]+a[i].x1-a[k].x1,dp[k][1]+a[k].x2-a[i].x1);
return;
}
else k--;
}
if(a[i].h-a[k].h>mx)dp[i][0]= inf;
else if(k==0)dp[i][0]=a[i].h-a[k].h;
}
void right(int i){
int k=i-1;
while(k>0&&a[i].h-a[k].h<=mx){
if(a[k].x1<=a[i].x2&&a[k].x2>=a[i].x2) {
dp[i][1]=a[i].h-a[k].h+min(dp[k][0]+a[i].x2-a[k].x1,dp[k][1]+a[k].x2-a[i].x2);
return;
}
else k--;
}
if(a[i].h-a[k].h>mx)dp[i][1]= inf;
else if(k==0)dp[i][1]=a[i].h-a[k].h;
}
int main(int argc, char** argv) {
int t;
cin>>t;
while(t--){
cin>>n>>x>>y>>mx;
for(int i=1;i<=n;i++){
cin>>a[i].x1>>a[i].x2>>a[i].h;
}
a[n+1].h=y;
a[n+1].x1=a[n+1].x2=x;
a[0].h=0;
a[0].x1=-20000 ;
a[0].x2=20000;
sort(a,a+n+1,cmp);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n+1;i++){
left(i);
right(i);
}
cout<<min(dp[n+1][0],dp[n+1][1])<<endl;
}
return 0;
}
滑雪
#include <bits/stdc++.h>
using namespace std;
#define MAX 105
int a[MAX][MAX];
int dp[MAX][MAX];
int m,n;
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
int dfs(int x,int y){
if(dp[x][y]>0)return dp[x][y];
dp[x][y]=1;
for(int k=0;k<4;k++){
if((x+dx[k])>=0&&(x+dx[k])<=m-1&&(y+dy[k])>=0&&(y+dy[k])<=n-1&&a[x+dx[k]][y+dy[k]]<a[x][y])
dp[x][y]=max(dp[x][y],dfs(x+dx[k],y+dy[k])+1);
}
return dp[x][y];
}
int main(int argc, char** argv) {
cin>>m>>n;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
dp[m][n]=-1;
}
}
int ans=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
ans=max(ans,dfs(i,j));
}
}
cout<<ans<<endl;
return 0;
}
#include<iostream>
using namespace std;
const int Max = 105;
int row, col;
int map[Max][Max];
int dp[Max][Max];
int dfs(int r, int c)
{
if (dp[r][c] != 0)
return dp[r][c];
int max = 1;
if (r + 1 <= row && map[r][c] > map[r + 1][c])
{
int len = dfs(r + 1, c) + 1;
if (len > max)
max = len;
}
if (r - 1 >= 1 && map[r][c] > map[r - 1][c])
{
int len = dfs(r - 1, c) + 1;
if (len > max)
max = len;
}
if (c + 1 <= col && map[r][c] > map[r][c + 1])
{
int len = dfs(r, c + 1) + 1;
if (len > max)
max = len;
}
if (c - 1 >= 1 && map[r][c] > map[r][c - 1])
{
int len = dfs(r, c - 1) + 1;
if (len > max)
max = len;
}
return map[r][c] = max;
}
int main()
{
int i, j;
cin >> row >> col;
for (i = 1; i <= row; i++)
for (j = 1; j <= col; j++)
cin >> map[i][j];
int ans = 0;
memset(dp, 0, sizeof(dp));
for (i = 1; i <= row; i++)
for (j = 1; j <= col; j++)
{
dp[i][j] = dfs(i, j);
if (dp[i][j] > ans)
ans = dp[i][j];
}
cout << ans << endl;
return 0;
}
原文链接:https:
神奇口袋
#include <bits/stdc++.h>
using namespace std;
int dp[25][45];
int main(int argc, char** argv) {
int n;
cin>>n;
int w[n];
for(int i=0;i<n;i++){
cin>>w[i];
}
memset(dp,0,sizeof(dp));
for(int j=0;j<=n;j++){
dp[j][0]=1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=40;j++){
if(j-w[i-1]>=0)dp[i][j]=dp[i-1][j]+dp[i-1][j-w[i-1]];
else dp[i][j]=dp[i-1][j];
}
}
cout<<dp[n][40]<<endl;
return 0;
}
7113:Charm Bracelet(典型01口袋)
#include <bits/stdc++.h>
using namespace std;
#define MAX 34050
int v[MAX];
int w[MAX];
int n,m;
int dp[MAX];
int main(int argc, char** argv) {
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>w[i]>>v[i];
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
for(int j=m;j>=1;j--){
if(j>=w[i-1])dp[j]=max(dp[j],v[i-1]+dp[j-w[i-1]]);
}
}
cout<<dp[m];
return 0;
}
7215:简单的整数划分问题
#include <bits/stdc++.h>
using namespace std;
#define MAX 51
int dp[MAX][MAX];
int main(int argc, char** argv) {
int x;
memset(dp,0,sizeof(dp));
while(cin>>x){
dp[0][0]=1;
for(int i=0;i<=x;i++){
for(int j=1;j<=x;j++){
if(i<j)dp[i][j]=dp[i][j-1];
else dp[i][j]=dp[i-j][j]+dp[i][j-1];
}
}
cout<<dp[x][x]<<endl;
}
return 0;
}
7219:复杂的整数划分问题
#include <bits/stdc++.h>
using namespace std;
#define MAX 51
typedef long long int ll;
ll dp[MAX][MAX];
ll dp2[MAX][MAX];
ll dp3[MAX][MAX];
int main(int argc, char** argv) {
int n,k;
while(cin>>n>>k){
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
dp[i][1]=1;
for(int j=2;j<=n;j++){
if(i>=j){
dp[i][j]=dp[i-1][j-1]+dp[i-j][j];
}
}
}
cout<<dp[n][k]<<endl;
memset(dp2,0,sizeof(dp2));
dp2[0][0]=1;
for(int i=0;i<=n;i++){
for(int j=1;j<=n;j++){
if(i<j)dp2[i][j]=dp2[i][i];
else{
dp2[i][j]=dp2[i-j][j-1]+dp2[i][j-1];
}
}
}
cout<<dp2[n][n]<<endl;
memset(dp3,0,sizeof(dp3));
dp3[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(j%2==1){
if(i>j)dp3[i][j]=dp3[i-j][j]+dp3[i][j-1];
else if(i==j)dp3[i][j]=dp3[i][j-1]+1;
else dp3[i][j]=dp3[i][i];
}
else dp3[i][j]=dp3[i][j-1];
}
}
cout<<dp3[n][n]<<endl;
}
return 0;
}