题单
#include
#include
using namespace std;
int r;
int arr[1010][1010],dp[1010][1010];
int main(){
cin>>r;
//输入
for(int i=0;i<r;i++){
for(int j=0;j<=i;j++){
cin>>arr[i][j];
}
}
//dp
for(int i=r-1;i>=0;i--){
for(int j=0;j<=i;j++){
dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+arr[i][j];
}
}
cout<<dp[0][0]<<endl;
}
#include
#include
#include
using namespace std;
int R,C,temp;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int dp[110][110],maze[110][110],ans;
struct node{
int x,y,z;
bool operator<(const node&n) const{
return z>n.z;
}
};
priority_queue<node> q;//使用优先级队列是为了无后效性
int main(){
cin>>R>>C;
//初始化
for(int i=0;i<R;i++){
for(int j=0;j<C;j++){
cin>>maze[i][j];
q.push({i,j,maze[i][j]});
}
}
for(int i=0;i<R;i++){
for(int j=0;j<C;j++){
dp[i][j]=1;
}
}
while(q.size()){
int x=q.top().x,y=q.top().y,z=q.top().z;q.pop();
temp=0;
for(int i=0;i<4;i++){
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0&&nx<R&&ny>=0&&ny<C&&maze[nx][ny]<maze[x][y]){
temp=max(temp,dp[nx][ny]);
}
}
dp[x][y]+=temp;
}
for(int i=0;i<R;i++){
for(int j=0;j<C;j++){
ans=max(ans,dp[i][j]);
}
}
cout<<ans<<endl;
}
#include
#include
#include
using namespace std;
int N,arr[25],g[25][25],dp[25],pre[25],ans,t;
void printpath(int x){
if(pre[x]!=-1) printpath(pre[x]);
cout<<x+1<<" ";
}
int main(){
cin>>N;
memset(pre,-1,sizeof pre);
for(int i=0;i<N;i++) cin>>arr[i];
for(int i=0;i<N;i++){
for(int j=i+1;j<N;j++){
int x;cin>>x;
if(x) g[i][j]=1;
}
}
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(g[j][i]&&dp[j]>dp[i]){
dp[i]=dp[j];
pre[i]=j;
}
}
dp[i]+=arr[i];
if(ans<dp[i]){
ans=dp[i];
t=i;
}
}
printpath(t);cout<<endl;
cout<<ans<<endl;
}
#include
#include
#include
#include
using namespace std;
const int Maxm=500010,Maxn=5010,M=80112002;
int n,m,tot,ans,head[Maxn],in_deg[Maxn],out_deg[Maxn],dp[Maxn];
struct Edge{
int to,next;
}e[Maxm];
queue<int> q;
void add(int x,int y){
e[++tot].to=y;
e[tot].next=head[x];
head[x]=tot;
in_deg[y]++;
out_deg[x]++;
}
void toposort(){
for(int i=1;i<=n;i++){
if(in_deg[i]==0) {
q.push(i);dp[i]=1;
}
}
while(q.size()){
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(--in_deg[v]==0){
q.push(v);
}
dp[v]=(dp[v]+dp[u])%M;
}
}
for(int i=1;i<=n;i++){
if(out_deg[i]==0){
ans=(ans+dp[i])%M;
}
}
}
int main(){
cin>>n>>m;
for(int i=0;i<m;i++){
int x,y;cin>>x>>y;
add(x,y);
}
toposort();
cout<<ans<<endl;
}
#include
#include
#include
using namespace std;
//f[i][j]表示将前i件物品放入容量为j的背包中
int T,M,w[110],v[110],f[1010];
int main(){
cin>>T>>M;
for(int i=1;i<=M;i++){
cin>>w[i]>>v[i];
}
for(int i=1;i<=M;i++){
for(int j=T;j>=0;j--){
if(j>=w[i]){
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
}
}
cout<<f[T]<<endl;
}
#include
#include
using namespace std;
int N,M,w[10000010],v[10000010],dp[10000010];
int main(){
cin>>N>>M;
for(int i=1;i<=M;i++){
cin>>w[i]>>v[i];
}
for(int i=1;i<=M;i++){
for(int j=0;j<=N;j++){
if(j>=w[i]){
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
}
cout<<dp[N]<<endl;
}
#include
#include
using namespace std;
int n,x,lose[1010],win[1010],use[1010];
long long f[1010];
int main(){
cin>>n>>x;
for(int i=1;i<=n;i++){
cin>>lose[i]>>win[i]>>use[i];
}
for(int i=1;i<=n;i++){
for(int j=x;j>=0;j--){
if(j>=use[i]){
f[j]=max(f[j]+lose[i],f[j-use[i]]+win[i]);
}
else{
f[j]+=lose[i];
}
}
}
cout<<5*f[x]<<endl;
}
#include
#include
using namespace std;
int bx,by,ans,hx,hy;
long long dp[25][25];
int dx[]={2,1,-1,-2,-2,-1,1,2};
int dy[]={1,2,2,1,-1,-2,-2,-1};
int main(){
cin>>bx>>by>>hx>>hy;
for(int i=0;i<8;i++){
if(0==hx+dx[i]&&0==hy+dy[i]||bx==hx+dx[i]&&by==hy+dy[i]) {
cout<<0<<endl;
return 0;
}
}
dp[0][0]=1;
for(int i=0;i<=bx;i++){
for(int j=0;j<=by;j++){
bool flag=false;
for(int k=0;k<8;k++){
if(i==hx+dx[k]&&j==hy+dy[k]||i==hx&&j==hy){
flag=true;break;
}
}
if(!flag){
if(i>=1) dp[i][j]+=dp[i-1][j];
if(j>=1) dp[i][j]+=dp[i][j-1];
}
}
}
cout<<dp[bx][by]<<endl;
}