来不及写注释了,多看看应该可以理解,动态转移方程很难推,随缘推的,推的也不一定对,这次纯纯是面向样例编程的
1.霍格沃茨:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
typedef struct {
int x;
int y;
int w;
}Node;
int main() {
int n=0,m=0,s=0;
scanf("%d%d",&n,&m);
Node chessboard[n][n];
for (int i=0; i<n; i++)
{
for (int j=0; j<n; j++)
{
scanf("%d",&s);
chessboard[i][j].x=i;
chessboard[i][j].y=j;
chessboard[i][j].w=s;
}
}
for (int i=1;i<n;i++)
{
for(int j=1;j<n;j++)
{
chessboard[i][j].w+=chessboard[i-1][j].w>chessboard[i][j-1].w?chessboard[i-1][j].w:chessboard[i][j-1].w;
}
}
printf("%d\n",(2*n-3)*m-chessboard[n-1][n-1].w);
return 0;
}
2地精的帽子:
最长上升子序列
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=100010;
int a[N],s[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++)
{
s[i]=1;
for(int j=1;j<i;j++)
{
if(a[j]<a[i])s[i]=max(s[i],s[j]+1);
}
}
int ans=0;
for(int i=1;i<=n;i++)ans=max(ans,s[i]);
cout<<ans;
return 0;
}
3,贫瘠之地:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
typedef struct {
int red[maxsize+1];
int blue[maxsize+1];
int value[maxsize+1];
int f[maxsize+1][maxsize+1];//N,red,blue
}Bag;
Bag create(int Red, int Blue, int N){
Bag Alice;
//初始化 f[i][j]
Alice.red[0]=0;
Alice.blue[0]=0;
Alice.value[0]=0;
for (int x=0; x<Red+1; x++)
for (int y=0; y<Blue+1; y++)
Alice.f[x][y]=0;
//给 red[] & blue[] & value[] 赋值
for (int i=1; i<=N; i++) {
int red=0,blue=0,value=0;
scanf("%d%d%d",&red,&blue,&value);
Alice.red[i]=red;
Alice.blue[i]=blue;
Alice.value[i]=value;
}
for (int z=1; z<=N; z++){
for (int x=Red; x>=Alice.red[z]; x--) {//这里是为了避免成为二维完全背包,所以 -- 而不是 ++
for (int y=Blue; y>=Alice.blue[z]; y--) {
if (Alice.f[x][y]>Alice.f[x-Alice.red[z]][y-Alice.blue[z]]+Alice.value[z]) {
Alice.f[x][y]=Alice.f[x][y];
} else {
Alice.f[x][y]=Alice.f[x-Alice.red[z]][y-Alice.blue[z]]+Alice.value[z];
}
}
}
}
return Alice;
}
Bag workout (int Red, int Blue, int N, Bag Alice){
for (int z=1; z<=N; z++){
for (int x=Red; x>=Alice.red[z]; x--) {
for (int y=Blue; y>=Alice.blue[z]; y--) {
if (Alice.f[x][y]>Alice.f[x-Alice.red[z]][y-Alice.blue[z]]+Alice.value[z]) {
Alice.f[x][y]=Alice.f[x][y];
} else {
Alice.f[x][y]=Alice.f[x-Alice.red[z]][y-Alice.blue[z]]+Alice.value[z];
}
}
}
}
return Alice;
}
int main(int argc, const char * argv[]) {
int Red=0,Blue=0,N=0;//Red&Blue的含义在背包问题中等价于背包总承重,N相当于怪物个数
scanf("%d%d%d",&Red,&Blue,&N);
Bag Alice=create(Red, Blue, N);
// Alice=workout(Red, Blue, N, Alice);
printf("%d\n",Alice.f[Red][Blue]);
return 0;
}
4.最长公共上升子序列:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=1010;
int f[N][N];
int main()
{
string a,b;
string s1,s2;
cin>>s1>>s2;
a=' '+s1;
b=' '+s2;
int n=a.size(),m=b.size();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
f[i][j]=max(f[i-1][j],f[i][j-1]);
if(a[i]==b[j])f[i][j]=max(f[i][j],f[i-1][j-1]+1);
}
}
cout<<f[n][m];
return 0;
}