目录
- P1434 滑雪
- P1002 过河卒
- P1020 导弹拦截
- P4933 大师
- P1233 木棍加工
P1434 滑雪
#include
using namespace std;
const int maxn = 110;
int r,c;
int a[maxn][maxn];
int s[maxn][maxn];
int ans;
int dis[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int dfs(int x,int y){
if(s[x][y]) return s[x][y];
s[x][y]=1;
for(int i=0;i<4;i++){
int xx = dis[i][0]+x;
int yy = dis[i][1]+y;
if(xx>0&&xx<=r&&yy>0&&yy<=c){
if(a[x][y]>a[xx][yy]){
dfs(xx,yy);
s[x][y] = max(s[x][y],s[xx][yy]+1);
}
}
}
return s[x][y];
}
int main(){
scanf("%d%d",&r,&c);
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
scanf("%d",&a[i][j]);
}
}
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
ans = max(ans,dfs(i,j));
}
}
printf("%d\n",ans);
return 0;
}
P1002 过河卒
#include
using namespace std;
const int maxn = 1100;
int dis[8][2]={{-1,-2},{1,-2},{-1,2},{1,2},{2,1},{-2,-1},{-2,1},{2,-1}};
int n,m,x,y;
bool b[maxn][maxn];
long long a[maxn][maxn];
int main(){
memset(b,0,sizeof(b));
scanf("%d%d%d%d",&n,&m,&x,&y);
b[x][y] = 1;
for(int i =0;i<=7;i++){
if(x+dis[i][0]>=0 && x+dis[i][0]<=n &&y+dis[i][1]>=0 &&y+dis[i][1]<=m){
b[x+dis[i][0]][y+dis[i][1]] =1;
}
}
int k =0;
while(!b[k][0]&&k<=n){
a[k++][0] = 1;
}
int l =0;
while(!b[0][l] &&l<=m){
a[0][l++] = 1;
}
for(int i =1;i<=n;i++){
for(int j =1;j<=m;j++){
if(b[i][j]){
a[i][j] = 0;
}else{
a[i][j] = a[i-1][j]+a[i][j-1];
}
}
}
printf("%lld\n",a[n][m]);
return 0;
}
P1020 导弹拦截
#include
using namespace std;
const int maxn = 1000010;
int a[maxn];
int cnt =0,ans=0;
int dp[maxn],dp2[maxn];
int main(){
int num,index=0;
while(scanf("%d",&num)!=EOF){
a[index++]=num;
}
for(int i=0;i<index;i++){
dp[i] = 1;
dp2[i] = 1;
for(int j=0;j<i;j++){
if(a[j]>=a[i]){
dp[i] = max(dp[i],dp[j]+1);
}else{
dp2[i] = max(dp2[i],dp2[j]+1);
}
}
cnt = max(cnt,dp[i]);
ans = max(ans,dp2[i]);
}
cout<<cnt<<endl;
cout<<ans<<endl;
return 0;
}
P4933 大师
#include
using namespace std;
const int maxn = 1010;
const int maxv = 20008;
int n;
int h[maxn];
long long dp[maxn][2*maxv];
int mod = 998244353;
long long ans=0;
int main(){
scanf("%d",&n);
for(int i =1;i<=n;i++){
scanf("%d",&h[i]);
}
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++){
dp[i][h[i]-h[j]+20000]=(dp[i][h[i]-h[j]+20000]+dp[j][h[i]-h[j]+20000]+1)%mod;
ans = (ans+dp[j][h[i]-h[j]+20000]+1)%mod;
}
}
ans = (ans+n)%mod;
printf("%lld\n",ans);
return 0;
}
P1233 木棍加工
#include
using namespace std;
const int maxn = 10010;
struct goods{
int l,w;
}good[maxn];
int n,ans=0;
int dp[maxn];
bool cmp(goods a,goods b){
if(a.l!=b.l) return a.l>b.l;
else return a.w>b.w;
}
int main(){
scanf("%d",&n);
for(int i =1;i<=n;i++){
scanf("%d %d",&good[i].l,&good[i].w);
}
sort(good+1,good+1+n,cmp);
for(int i=1;i<=n;i++){
dp[i] = 1;
for(int j=1;j<i;j++){
if(good[i].w>good[j].w){
dp[i] = max(dp[i],dp[j]+1);
}
}
ans = max(ans,dp[i]);
}
cout<<ans<<endl;
return 0;
}