专栏文章
1.16 dp总结
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqi04u5
- 此快照首次捕获于
- 2025/12/04 05:07 3 个月前
- 此快照最后确认于
- 2025/12/04 05:07 3 个月前
dp总结
总分: 163 //第一题没换行
-
CPP
0 -
CPP
40 -
CPP
20 -
CPP
10 -
CPP
100 -
CPP
0
第一题 B2064 斐波那契数列
1.代码:错误
CPP#include<bits/stdc++.h>
#define int long long
int dp[100005];
using namespace std;
void node(){
int x;
cin>>x;
for(int i=1;i<=x;i++){
if(i==1){
dp[i]=1;
continue;
}
if(i==2){
dp[i]=1;
continue;
}
dp[i]=dp[i-1]+dp[i-2];
}
cout<<dp[x];//写错了,没换行
}
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
node();
}
}
代码:正确
CPP#include<bits/stdc++.h>
#define int long long
int dp[100005];
using namespace std;
void node(){
int x;
cin>>x;
for(int i=1;i<=x;i++){
if(i==1){
dp[i]=1;
continue;
}
if(i==2){
dp[i]=1;
continue;
}
dp[i]=dp[i-1]+dp[i-2];
}
cout<<dp[x]<<endl;
}
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
node();
}
}
2.四步法:
1.确定状态
dp[i]斐波那契数列的i列
2.确定答案
dp[n]
3.确定状态转移方程
dp[i]=dp[i-1]+dp[i-2]
4.确定初始值和边界条件
dp[i]=1
第二题 P5732 【深基5.习7】杨辉三角
1.代码:正确
CPP
#include<bits/stdc++.h>
#define int long long
int dp[50][50];
using namespace std;
signed main(){
int n;
cin>>n;
dp[1][1]=1;
cout<<dp[1][1]<<endl;
for(int i=2;i<=n;i++){
for(int j=1;j<=i;j++){
dp[i][j]=dp[i-1][j]+dp[i - 1][j-1];
cout << dp[i][j] << ' ';
}
cout<<endl;
}
}
2.四步法:
1.确定状态
dp[i][j] 以(i,j) 为最大答案
2.确定答案
max{dp[n][i]} n行的全部答案最大值
3.确定状态转移方程
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j]
4.确定初始值和边界条件
dp[1][1]=a[1][1]
第三题 B3637 最长上升子序列
1.代码:正确
CPP#include<bits/stdc++.h>
#define int long long
int a[1000000];
int dp[1000000];
using namespace std;
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int maxx=1;
for(int i=1;i<=n;i++){
dp[i]=1;
for(int j=1;j<=i;j++){
if(a[i]>a[j]){
dp[i]=max(dp[i],dp[j]+1);
}
}
maxx=max(maxx,dp[i]);
}
cout<<maxx;
}
2.四步法:
四步法:
1.确定状态
dp[i]以i结尾的最长上升子序列的长度
2.确定答案
max(maxx,dp[i])
3.确定状态转移方程
dp[i]=dp[i-1]+dp[i-2]
4.确定初始值和边界条件
dp[i]=1
第四题 P6702 [COCI2010-2011#7] ŠEĆER
1.代码:正确
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
int n;
cin>>n;
int minn=1e9;
int flag=0;
for(int i=0;i<=5000;i++){
for(int j=0;j<=5000;j++){
if(i*3+j*5==n){
minn=min(i+j,minn);
flag=1;
}
}
}
if(flag==1){
cout<<minn;
}
else{
cout<<-1;
}
}
#四步法:
1.确定状态
dp[i]i颗糖的最少盒子数
2.确定答案
dp[n]
3.确定状态转移方程
dp[i]=min(dp[i-3]+dp[i-5])+1
i-3是加1个3颗糖的盒子
i-5是加1个5颗糖的盒子
4.确定初始值和边界条件
dp[0]=0 dp[1]=dp[2]=dp[4]=1e9
第五题 P1028 [NOIP2001 普及组] 数的计算
1.代码:正确
CPP#include<bits/stdc++.h>
#define int long long
int dp[100005];
using namespace std;
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
dp[i]=1;
for(int j=1;j<=i/2;j++){
dp[i]+=dp[j];
}
}
cout<<dp[n];
}
2.四步法:
1.确定状态
dp[i]
2.确定答案
dp[n]
3.确定状态转移方程
p[i]+=dp[j];
4.确定初始值和边界条件
dp[i]=1
第六题 P1057 [NOIP2008 普及组] 传球游戏
送头文件:
CPP#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <float.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <wchar.h>
#include <wctype.h>
#include <algorithm>
#include <bitset>
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <limits>
#include <list>
#include <map>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <utility>
#include <vector>
#include <cwchar>
#include <cwctype>
#define tin int
#define itn int
#define tni int
#define nit int
#define nti int
#define pritnf printf
#define scnaf scanf
#define int long long
using namespace std ;
signed main()
{
// std::ios::sync_with_stdio( false ) ;
// std::cin.tie( 0 ) ;
// std::cout.tie( 0 ) ;
return 0 ;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...